【问题标题】:How to compare and print matching hash values in Ruby?如何在 Ruby 中比较和打印匹配的哈希值?
【发布时间】:2017-02-19 12:49:33
【问题描述】:

我有两个像下面这样的哈希,

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 背景,使用 for 循环和迭代器很容易做到,但使用 Ruby 则非常困难。

【问题讨论】:

  • 您的问题不清楚。 “它不起作用”是什么意思? 如何它不起作用?你有错误吗?如果是,您收到的 precise 错误消息是什么,回溯是什么,错误发生在哪一行?你收到警告了吗?如果是,precise 警告消息是什么?警告出现在哪一行?观察到的行为是否与预期的行为不同?如果是,观察到的行为是什么,预期的行为是什么?请提供确切您想要做什么的规范,包括所有例外、特殊情况……
  • … 极端情况和边缘情况。此外,请提供示例输入和输出作为测试用例,包括异常、极端情况、特殊情况和边缘情况的示例。在标题中,您询问的是“匹配值”。我期望匹配值的结果是[{"b" => 2}, {"c" => 3}, {"d" => 3}]。在问题正文中,您正在询问“匹配键”。我期望匹配键的结果是[{"a" => 1}, {"a" => 2}, {"b" => 2}]。但是,这些都不符合您想要的{"b" => 2} 的结果。

标签: ruby


【解决方案1】:
h1.merge(h2) { |k,o,n| puts "#{k}=>#{o}" if o == n }
"b" => 2

这使用Hash#merge 的形式,它使用一个块来确定在被合并的两个散列中存在的键的值。有关详细信息,请参阅文档。

【讨论】:

    【解决方案2】:

    第二个循环不是必需的。

    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
    

    【讨论】:

      【解决方案3】:

      你可能会写类似的东西

      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
      

      【讨论】:

        【解决方案4】:

        如果结果是主要目标,选择也可以:

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

        【讨论】:

          猜你喜欢
          • 2015-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-30
          • 1970-01-01
          • 2021-05-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多