2016-07-18 65 views
0

我有两个散列这样的:如何比较红宝石哈希与相同的密钥?

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

欢迎来到Stack Overflow。请阅读“[问]”,包括链接的页面和“[mcve]”。我们希望看到你的努力的证据。目前看起来您还没有尝试过,并要求我们为您编写代码。 http://meta.stackoverflow.com/q/261592/128421是一个有用的阅读。 –

回答

3

关于Ruby很酷的事情是,它是如此之高的水平,它往往是基本英语:从第一个哈希

打印键,如果在两个散列值不同:

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

选择在两个散列值不同的第一哈希键和打印他们每个人:

hash1.keys.select { |key| hash1[key] != hash2[key] }.each { |key| puts key } 
+0

只需'放置hash1.keys.select {| key | hash1 [key]!= hash2 [key]}#打印“part3”'? –

+0

@CarySwoveland,是的,也是一个不错的主意,容易发音。 – ndn

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"] 

这使用哈希#合并了采用块的形式(这里{ |_,v1,v2| v1==v2 }),以确定存在于被合并两个散列密钥的值。有关三个块变量的说明,请参阅文档_,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"] 
0

的显而易见的方法是,NDN,此处为通过转换为阵列,将它们连接并减去是相同的元素,而不块溶液,接着通过转换回散列并询问密钥。

下一次包含您迄今尝试的内容会更好。

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