有更好的方法来判断一个Ruby散列是否在另一个散列中吗?

4

比如哈希a{:name=>'迈克',:age=>27,:gender=>'男性'},哈希b{:name=>'迈克'}

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

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

a.merge(b)==a


由于它是哈希表,比较键非常高效,您不必担心它。 - Maurício Linhares
此外,合并操作效率低下,因为它将在内存中生成一个新的哈希表,你应该比较键。 - Maurício Linhares
谢谢你,Mauricio,你是大师! - Mike Li
2个回答

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的大小上是线性的,因为循环内的两个步骤(平均而言)都需要恒定的时间。


调用 include? 然后再调用 a[key] 使得这段代码非常低效,因为它尝试两次查找键。 - Maurício Linhares
1
@MaurícioLinhares:哈希表的访问是O(1),所以我不明白为什么这会低效。实际上,我认为这是最概念上高效的代码(尽管将其转换为数组并相交可能更快,因为此交集是用C实现的)。我会将include?改为has_key?,这样更清晰一些。而且为什么要为第二个条件创建一个新的(未缩进的)行呢? - tokland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接