【问题标题】:How to sort nested hash in ruby?如何对ruby中的嵌套哈希进行排序?
【发布时间】:2018-07-24 20:58:54
【问题描述】:
example_hash = {
  "1" => {"occurence": 12, "display": ""},
  "2" => {"occurence": 15, "display": ""},
  "3" => {"occurence": 16, "display": ""}
}

对于上面给出的嵌套哈希,我们如何根据出现值对其进行排序(降序)。结果应按排序顺序显示键 [3,2,1]

【问题讨论】:

标签: ruby hash


【解决方案1】:
example_hash.sort_by { |_,h| -h[:occurrence] }
  #=> [["3", {:occurrence=>16, :display=>""}],
  #    ["2", {:occurrence=>15, :display=>""}],
  #    ["1", {:occurrence=>12, :display=>""}]]

如果需要散列,请使用.to_h,但通常不希望使用以特定方式排序的键的散列。

【讨论】:

  • 沙赞!对于我们这些还在用sort{|a,b| ...} 打拳的拳头,你能多谈谈那个语法吗?
  • @jvillian,没什么好说的,就是方法Enumerable#sort_by。与sort 相比,它的一个优点是h["occurrence"] 对每个值(散列)只计算一次,而不是与sort 的每个成对比较计算两次。
  • 我想我是被|_,h| 位中的下划线抛出的。这个下划线是如何工作的?另外,-h[:occurrence]。我猜h前面的-表示降序?
  • @jvillian,一个 Ruby 约定是在块计算中不使用时用下划线表示块变量('嘿,读者,我没有在这个块中使用这个变量')。这里该变量代表一个哈希键。虽然_ 是一个有效的局部变量,但它与不以下划线开头的变量名称不同,因为Ruby 允许它用于表示多个局部变量(例如,{ |_,_,x|...}_,x,_ = [1,2,3])。有时您可能会在不使用_k 时看到{ |_k,h|...}
【解决方案2】:

在控制台中,这个:

example_hash.sort{|a,b| b[1][:occurence] <=> a[1][:occurence]}.to_h

返回这个:

{"3"=>{:occurence=>16, :display=>""}, "2"=>{:occurence=>15, :display=>""}, "1"=>{:occurence=>12, :display=>""}}

顺便说一句,我相信您拼错了“发生”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多