查看另一个哈希中是否存在一个哈希中的密钥?

时间:2011-08-11 20:33:59

标签: ruby algorithm

查看一个Ruby散列中是否存在另一个不存在的密钥的快速(甚至最快?)方式是什么?我假设哈希是最有效的数据结构,但我可以做任何事情,例如把东西放在一个Set中。

3 个答案:

答案 0 :(得分:8)

a = { :a => 1, :b => 2 , :v => 3}
b = { :a => 3, :b => 22 , :g => 3}
a.keys - b.keys
#=> [:v]
b.keys - a.keys
#=> [:g]

答案 1 :(得分:3)

一种简单的方法就像:

hash1.keys - hash2.keys

您的结果是hash1中不在hash2

中的键

答案 2 :(得分:1)

@fl00r's answer是我个人写的,因为它对我来说很快(编码器)。但是,既然你要求“快速”,并且可能意味着“快速使用电脑”,你应该知道每次调用它时都必须完全按下两组键。

如果您需要经常这样做,并且您真的只关心是否有任何键可能会丢失,您可能会这样做:

def same_keys?( a, b )
  a.length == b.length && a.keys.all?{ |k| b.key?(k) }
end

如果没有相同数量的密钥,您会提前退出,并且一旦发现另一个密钥不存在,您就会提前退出。与使用数组集数学的更强大的答案不同,您不会发现一个哈希中存在多少个键或哪些键,而不是另一个哈希中的键。

注意:我有对上述内容进行基准测试,以表明它会更快。鉴于数组数学是用C实现的,调用 all? 并为所有键调用 key? 方法可能比为你关心的许多哈希获得完整的差异。