2017-02-19 78 views
-1

我有一个像下面两个散列,如何比较和打印Ruby中匹配的哈希值?

h1 = {"a" => 1, "b" => 2, "c" => 3} 
h2 = {"a" => 2, "b" => 2, "d" => 3} 

我想遍历HASH1和HASH2并找到匹配键和值并将其打印在控制台。 举例这里应该返回输出“B” => 2倍。其不与下面的代码工作,

h1.each do |key1, value1| 

    h2.each do |key2, value2| 
    if ((h2.include? key1) && (h2.include? value1)) 
     puts "matching h2 key #{h2[key2]}and h1 key #{h1[key1]}" 
    else 
     puts " don not match h2 key #{h2[key2]}and h1 key #{h1[key1]}" 
    end 
    end 
end 

我是从基本的C++和Java的背景和它很容易做到使用循环和迭代,但使用Ruby,这是非常困难的。

+1

你的问题还不清楚。 “它不工作”是什么意思? *如何*它不起作用?你有错误吗?如果是的话,你得到的*精确*错误信息是什么,回溯是什么,错误发生在哪一行?你有什么警告吗?如果是,那么*精确*警告信息是什么,警告发生在哪一行?观察到的行为是否与预期行为不同?如果是,那么*观察到的行为是什么,预期的行为是什么?请详细说明您想要做什么,包括任何和所有例外情况,特殊情况...... –

+1

......角落案例和边缘案例。另外,请提供样本输入和输出作为测试用例,其中包括例外,角落案例,特殊情况和边缘案例。在标题中,您问的是“匹配值”。我期望匹配值的结果是'[{“b”=> 2},{“c”=> 3},{“d”=> 3}]'。在问题主体中,您问的是“匹配键”。我期望匹配键的结果是'[{“a”=> 1},{“a”=> 2},{“b”=> 2}]''。但是,这些都不符合你想要的结果'{“b”=> 2}'。 –

回答

0

你可能会喜欢写东西

h1.each do |k,v| 
    if h2[k] == v 
    puts "matched key = #{k} and value = #{v}" 
    else 
    puts "NOT matched key = #{k} and value = #{v}" 
    end 
end 

输出

NOT matched key = a and value = 1 
matched key = b and value = 2 
NOT matched key = c and value = 3 
0

不需要第二个循环。

h1.each do |key1, value1| 
    if (h2.include? key1) and (h2[key1] == value1) 
    puts "Match #{key1} with value #{value1}" 
    else 
    puts "#{key1} does not match" 
    end 
end 
+0

这个为我工作....谢谢 – Pratapkumarv4

1
h1.merge(h2) { |k,o,n| puts "#{k}=>#{o}" if o == n } 
"b" => 2 

这使用的Hash#merge了采用博克,以确定存在于被合并两个散列密钥的值的形式。详情请参阅文档。

0

如果结果为主要目标,选择可以工作了:

h1.select{|k,v| h2[k] == v }