2011-11-28 77 views
4

如哈希a{:name=>'mike',:age=>27,:gender=>'male'} 和哈希b{:name=>'mike'}有没有更好的方法来判断一个ruby散列是否在另一个散列?

我想知道是否有更好的方法来判断是否b哈希散列a内,而不是每一个键一个一个比较?

我找到了一种方法来做到这一点,比比较键更有效吗?

a.merge(B)==一个

+0

由于它是一个哈希,比较键**是非常有效的**,你不必关心它。 –

+0

此外,合并效率低下,因为它将在内存中生成** new **哈希,您应该比较键。 –

+0

谢谢Mauricio,你是上师! –

回答

5

我喜欢计算交叉口,的做法是你想要做什么:

a = { :a => :b, :c => :d } 
b = { :e => :f, :a => :b } 
c = { :a => :f, :e => :c } 

(a.to_a & b.to_a).any? # => true 
(a.to_a & c.to_a).any? # => false 
1
b.all? do |key, value| 
    a.include? key && 
    a[key] == value 
end 

该循环是在B的大小线性,因为回路取(平均)恒定的时间内这两个步骤。

+0

调用** include **然后** a [key] **使得此代码非常低效,因为它试图找到两次密钥。 –

+1

@MaurícioLinhares:访问哈希是O(1),所以我不明白为什么这将是低效的。实际上,我认为这是最有效的概念代码(尽管转换为数组并将它们相交可能会更快,因为此交叉点在C中实现)。我会把'include?'改成'has_key?',这更清楚一点。为什么要为第二个条件创建一个新的(缩进)行? – tokland

相关问题