【问题标题】:How to compare ruby hash with same key?如何将 ruby​​ 哈希与相同的键进行比较?
【发布时间】:2016-11-21 10:53:20
【问题描述】:

我有两个这样的哈希:

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" 的值在哈希中是不同的。我可以保证两个哈希的键相同,值可能不同。我想在它们的值不同时打印出键?

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

【问题讨论】:

标签: ruby


【解决方案1】:

显而易见的方法是 ndn,这里是一种无块的解决方案,通过转换为数组,将它们连接并减去相同的元素,然后转换回哈希并询问键。

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

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

【讨论】:

    【解决方案2】:

    编辑:如果感兴趣,我会留下这个,但@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 })来确定在被合并的两个哈希中存在的键的值。有关三个块变量_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"] 
    

    【讨论】:

      【解决方案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 }
      

      【讨论】:

      • puts hash1.keys.select { |key| hash1[key] != hash2[key] } # prints "part3" 怎么样?
      猜你喜欢
      • 1970-01-01
      • 2021-11-15
      • 2019-03-03
      • 2012-03-24
      • 1970-01-01
      • 2018-06-30
      • 2020-05-19
      • 2017-03-27
      • 2012-08-14
      相关资源
      最近更新 更多