如哈希a
是{:name=>'mike',:age=>27,:gender=>'male'}
和哈希b
是{:name=>'mike'}
有没有更好的方法来判断一个ruby散列是否在另一个散列?
我想知道是否有更好的方法来判断是否b
哈希散列a
内,而不是每一个键一个一个比较?
我找到了一种方法来做到这一点,比比较键更有效吗?
a.merge(B)==一个
如哈希a
是{:name=>'mike',:age=>27,:gender=>'male'}
和哈希b
是{:name=>'mike'}
有没有更好的方法来判断一个ruby散列是否在另一个散列?
我想知道是否有更好的方法来判断是否b
哈希散列a
内,而不是每一个键一个一个比较?
我找到了一种方法来做到这一点,比比较键更有效吗?
a.merge(B)==一个
我喜欢计算交叉口,的做法是你想要做什么:
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
b.all? do |key, value|
a.include? key &&
a[key] == value
end
该循环是在B的大小线性,因为回路取(平均)恒定的时间内这两个步骤。
调用** include **然后** a [key] **使得此代码非常低效,因为它试图找到两次密钥。 –
@MaurícioLinhares:访问哈希是O(1),所以我不明白为什么这将是低效的。实际上,我认为这是最有效的概念代码(尽管转换为数组并将它们相交可能会更快,因为此交叉点在C中实现)。我会把'include?'改成'has_key?',这更清楚一点。为什么要为第二个条件创建一个新的(缩进)行? – tokland
由于它是一个哈希,比较键**是非常有效的**,你不必关心它。 –
此外,合并效率低下,因为它将在内存中生成** new **哈希,您应该比较键。 –
谢谢Mauricio,你是上师! –