首页 > 解决方案 > 有人可以解释这种“将元素添加到集合”方法的工作原理吗?

问题描述

我是 Ruby 新手,正在做一些编码练习。这是给定的提示:

Ruby 在其标准库中提供了一个名为 Set 的类。让我们创建一组方法来像操作 Set 一样操作 Hash。像这样:

请注意,这些应该是安全的方法(不!)

set_add_el({}, :x) # => {:x => true}

set_add_el({:x => true}, :x) # => {:x => true} # This should automatically work if the first method worked

set_remove_el({:x => true}, :x) # => {}

等等......我还需要实现一些其他方法。但我只是想开始,也许我没有完全理解这个问题。功能标题后面的注释是什么意思?为了帮助我进一步说明我的问题,我在网上找到了第一种方法的解决方案:

def set_add_el(set, value)
    if set[value].nil?
        set[value] = true
    end
    return set 
end

首先,我认为问题是要求操纵散列,使其表现得像一个数学集。我很困惑,因为上面的函数似乎需要一个数组作为输入。其次,我运行了这段代码,但它似乎没有做它应该做的事情。我尝试将 ([3,4,5], 6) 和 ([3,4,5], 4) 作为参数传入。我希望第一个返回 [3,4,5,6],第二个返回 [3,4,5],因为在一个集合中不应该有重复。前者的输出返回 [3, 4, 5, nil, nil, nil, true] 这对我来说毫无意义。

标签: rubyhash

解决方案


您被要求展示如何使用散列来模拟集合,其中散列的所有键都具有相同的值true。稍后我将解决哈希值的问题。

集合和散列的关键共同属性是集合具有唯一值,而散列具有唯一键。

虽然给你的措辞不是很清楚,但我相信你被要求写两种方法,

def set_add_el(hash, obj)
  ...
end

def set_remove_el(hash, obj)
  ...
end

其中第一个是并行方法Set#add。你要证明你的方法set_add_el方法满足这两个属性:

set_add_el({}, :x)              #=> { :x => true }
set_add_el({:x => true}, :x)    #=> { :x => true }

后一种方法是并行方法Add#delete并且必须满足:

set_remove_el({:x => true}, :x) #=> {}

当您使用它时,您可能希望表明您的方法具有与集合类似的其他属性,例如以下。

set_add_el({:x => true}, :y)    #=> { :x => true, :y => true }
set_remove_el({:x => true}, :y) #=> { :x => true }

方便时,可以使用Set#to_aset方法将 a 映射到其元素的数组中:set.to_a. 哈希的可比较方法是Hash#keys:返回用于模拟集合h.keys的哈希键的数组。h

虽然已经指出哈希值适用true于所有键,但它们显然可以是任何对象。例如,它们可能都不同,也nil可能都不同。如果要添加h哈希和:x密钥,甚至可以写h[:x] = ['dog', 'cat', 'pig'].sample. 如果h #=> { :x => 'dog' }, 并且h[:x] = 'cat', 那么h #=> { :x => 'cat' }. 因此,虽然使用不同的值会改变散列,但它不会改变键,而且我们只对 感兴趣h.keys,这不是问题。


推荐阅读