如何比较ruby哈希与相同的密钥?

时间:2016-07-18 18:11:54

标签: ruby

我有两个这样的哈希:

hash1 = Hash.new
hash1["part1"] = "test1"
hash1["part2"] = "test2"
hash1["part3"] = "test3"

hash2 = Hash.new
hash2["part1"] = "test1"
hash2["part2"] = "test2"
hash2["part3"] = "test4"

预期输出:part3

基本上,我想迭代两个哈希值并打印出"part3",因为哈希值"part3"的值不同。我可以保证两个哈希的键都相同,值可能不同。我想在价值不同时打印出来的钥匙?

我试过一次迭代两个哈希并比较值,但似乎没有给出正确的解决方案。

3 个答案:

答案 0 :(得分:3)

关于Ruby的一个很酷的事情是,它的级别非常高,通常基本上都是英语:

  

如果两个哈希值中的值不同,则从第一个哈希中打印键:

df2
  

选择两个哈希中具有不同值的第一个哈希键并打印每个哈希键:

hash1.keys.each { |key| puts key if hash1[key] != hash2[key] }

答案 1 :(得分:1)

编辑:如果感兴趣的话,我会留下这个,但@ndn的解决方案当然更好。

p hash1.merge(hash2) { |_,v1,v2| v1==v2 }.reject { |_,v| v }.keys
  # ["part3"]

hash1["part1"] = "test99"
p hash1.merge(hash2) { |_,v1,v2| v1==v2 }.reject { |_,v| v }.keys
  # ["part1", "part3"] 

这使用Hash#merge的形式,它使用一个块(这里是{ |_,v1,v2| v1==v2 })来确定合并的两个哈希中存在的键的值。有关三个块变量的解释,请参阅doc _v1v2。第一个块变量等于公共密钥。我已经使用了局部变量_,这是在块计算中没有使用变量的惯例。

步骤(原始hash1):

g = hash1.merge(hash2) { |_,v1,v2| v1==v2 }
  #=> {"part1"=>true, "part2"=>true, "part3"=>false} 
h = g.reject { |_,v| v }
  #=> {"part3"=>false} 
h.keys
  #=> ["part3"] 

答案 2 :(得分:0)

显而易见的方法是ndn,这里是一个没有块的解决方案,通过转换为数组,连接它们并减去相同的元素,然后转换回hash并请求键。

下次最好包括你到目前为止所尝试的内容。

((hash1.to_a + hash2.to_a) - (hash1.to_a & hash2.to_a)).to_h.keys
# ["part3"]