首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Ruby比较2个散列

Ruby比较2个散列
EN

Stack Overflow用户
提问于 2014-10-10 02:32:19
回答 3查看 2.9K关注 0票数 0

如果键的顺序不同,有没有办法比较两个哈希值?例如

代码语言:javascript
复制
hash1 = { "it"=> 10,"was"=>11,"the"=>14,"best"=>1,"of"=>12,"times"=>2,
          "worst"=>1,"age"=>2,"wisdom"=>1,"foolishness"=>1,"epoch"=>2,
          "belief"=>1,"incredulity"=>1,"season"=>2,"light"=>1,"darkness"=>1,
          "spring"=>1,"hope"=>1,"winter"=>1,"despair"=>1,"we"=>4,"had"=>2,
          "everything"=>1,"before"=>2,"us"=>2,"nothing"=>1,"were"=>2,"all"=>2,
          "going"=>2,"direct"=>2,"to"=>1,"heaven"=>1,"other"=>1,
          "way"=>1,"in"=>2,"short"=>1,"period"=>2,"so"=>1,"far"=>1,"like"=>1,
          "present"=>1,"that"=>1,"some"=>1,"its"=>2,"noisiest"=>1,
          "authorities"=>1,"insisted"=>1,"on"=>1,"being"=>1,
          "received"=>1,"for"=>2,"good"=>1,"or"=>1,"evil"=>1,"superlative"=>1,
          "degree"=>1,"comparison"=>1,"only"=>1 }


hash2 = {"superlative"=>1, "it"=>10, "going"=>2, "spring"=>1, "age"=>2, 
         "despair"=>1, "received"=>1, "good"=>1, "some"=>1, "worst"=>1, "was"=>11,
         "only"=>1,"us"=>2, "evil"=>1, "belief"=>1, "for"=>2, "darkness"=>1,
         "comparison"=>1, "short"=>1, "in"=>2, "present"=>1, "direct"=>2, "were"=>2,
         "way"=>1, "degree"=>1, "or"=>1, "of"=>12, "epoch"=>2, "incredulity"=>1,
         "period"=>2, "heaven"=>1, "other"=>1, "being"=>1, "its"=>2, "so"=>1,
         "authorities"=>1, "times"=>2, "we"=>4, "noisiest"=>1, "light"=>1, "hope"=>1,
         "foolishness"=>1, "everything"=>1, "far"=>1, "wisdom"=>1, "season"=>2, "like"=>1,
         "before"=>2, "had"=>2, "the"=>14, "nothing"=>1, "winter"=>1, "best"=>1,
         "that"=>1, "all"=>2, "insisted"=>1, "to"=>1, "on"=>1}

每个散列都有相同的键。我如何比较它们,并确保每个键值都是正确的。我看到的所有问题和答案都以相同的顺序显示了带有键的散列。有关系吗?

我试着使用:

hash1_1 = hash1.select{|k,_| hash2.has_key? k}

它会吐出来:

代码语言:javascript
复制
{ "it"=>10, "was"=>11, "the"=>14, "best"=>1, "of"=>12, "times"=>2, 
     "worst"=>1, "age"=>2, "wisdom"=>1, "foolishness"=>1, "epoch"=>2, 
     "belief"=>1, "incredulity"=>1, "season"=>2, "light"=>1, 
     "darkness"=>1, "spring"=>1, "hope"=>1, "winter"=>1, "despair"=>1, 
     "we"=>4, "had"=>2, "everything"=>1, "before"=>2, "us"=>2, "nothing"=>1, 
     "were"=>2, "all"=>2, "going"=>2, "direct"=>2, "to"=>1, "heaven"=>1, 
     "other"=>1, "way"=>1, "in"=>2, "short"=>1, "period"=>2, "so"=>1, "far"=>1, 
     "like"=>1, "present"=>1, "that"=>1, "some"=>1, "its"=>2, "noisiest"=>1, 
     "authorities"=>1, "insisted"=>1, "on"=>1, "being"=>1, "received"=>1, 
     "for"=>2, "good"=>1, "or"=>1, "evil"=>1, "superlative"=>1, "degree"=>1, 
     "comparison"=>1, "only"=>1}

请帮我解释一下我需要做什么。谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-10 02:35:50

无论键的顺序如何,具有相同键/值对的两个散列将是相等的:

代码语言:javascript
复制
a = {:x => 1, :y => 2}
b = {:y => 2, :x => 1}

a == b
# => true
票数 5
EN

Stack Overflow用户

发布于 2014-10-10 02:54:41

你曲解了你的结果。你的代码运行得很好。但是你的算法是错误的。

我将使用您的hash1和hash2,并使用reject创建一个差异,以删除它们之间匹配的所有内容:

代码语言:javascript
复制
hash1["it"] = 9
hash1["Tony"] = "great"
hash2["Jeff"] = "awesome"
hash1.delete "was"

diff_in_hash1 = hash1.reject{|k,v| hash2[k] == v}
# => {"it"=>9, "Tony"=>"great"}

diff_in_hash2 = hash2.reject{|k,v| hash1[k] == v}
# => {"it"=>10, "was"=>11, "Jeff"=>"awesome"}

你现在怎么处理它们,由你决定。如果你得到的结果是空的哈希,那么一切都是一样的。

还有一个可能有用的gem called 'hashdiff'

票数 3
EN

Stack Overflow用户

发布于 2018-05-31 19:00:05

据我正确理解,您的主要目标是回答两个散列之间是否有任何差异。因此,如果完全匹配(两个散列的键和相应值),则比较结果应为true,否则为false。正如前面提到的here,从Ruby2.3开始。您可以使用:

代码语言:javascript
复制
{ a: 1 } <= { a: 1 } = true
{ a: 1 } <= { a: 2 } = false
{ a: 2 } <= { a: 1 } = false
{ a: 2 } <= { a: 2 } = true
{ a: 1 } >= { a: 1 } = true
{ a: 1 } >= { a: 2 } = false
{ a: 2 } >= { a: 1 } = false
{ a: 2 } >= { a: 2 } = true
{ a: 1 } <  { a: 1 } = false
{ a: 1 } <  { a: 2 } = false
{ a: 2 } <  { a: 1 } = false
{ a: 2 } <  { a: 2 } = false
{ a: 1 } >  { a: 1 } = false
{ a: 1 } >  { a: 2 } = false
{ a: 2 } >  { a: 1 } = false
{ a: 2 } >  { a: 2 } = false
{ a: 1 } == { a: 1 } = true
{ a: 1 } == { a: 2 } = false

代码语言:javascript
复制
{ a: 1, b: 2 } > { a: 1 } = true
{ a: 1, b: 2 } == { a: 1 } = false
{ a: 1, b: 2 } >= { a: 1 } = true
{ a: 1, b: 2 } > { a: 1, b: 5 } = false
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26285603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档