我有两个这样的哈希:
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"
的值不同。我可以保证两个哈希的键都相同,值可能不同。我想在价值不同时打印出来的钥匙?
我试过一次迭代两个哈希并比较值,但似乎没有给出正确的解决方案。
答案 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 _
,v1
和v2
。第一个块变量等于公共密钥。我已经使用了局部变量_
,这是在块计算中没有使用变量的惯例。
步骤(原始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"]