【问题标题】:Sorting nested hashes by multiple values in ruby在 ruby​​ 中按多个值对嵌套哈希进行排序
【发布时间】:2018-12-05 02:49:19
【问题描述】:

我有以下嵌套哈希结构:

{12 => {:points=>0, :diff=>0},
 1=> {:points=>18, :diff=>57},
 4=>{:points=>12, :diff=>67},
 5=>{:points=>9, :diff=>62}}

我想先按点(降序)和 diff 第二(升序)对其进行排序。

我只能使用以下值之一对其进行排序:

my_hash.sort_by {|participant_id, values| values[:points] }.reverse.to_h

但我一直无法找到按这两个值对其进行排序的方法。

我尝试过使用:

my_hash.sort_by {|participant_id, values| values[:diff] or values[:points] }.reverse.to_h

关于哈希排序的大多数答案都考虑一个值,例如this,而其他情况似乎不符合我的目的。您能帮忙寻找解决方案吗?

【问题讨论】:

    标签: ruby sorting hash


    【解决方案1】:

    我会这样做:

    hash = {12=>{:points=>0, :diff=>0}, 1=>{:points=>18, :diff=>57}, 4=>{:points=>12, :diff=>67}, 5=>{:points=>9, :diff=>62}}
    
    hash.sort_by { |_, v| [-v[:points], v[:diff]] }.to_h
    #=> {1=>{:points=>18, :diff=>57}, 4=>{:points=>12, :diff=>67}, 5=>{:points=>9, :diff=>62}, 12=>{:points=>0, :diff=>0}}
    

    基本上,它会将要排序的值提取到如下结构中:[[0,0], [-18,57], [-12,67], [-9,62]]。请注意-v[:points] 处的-,它会导致降序排列。仅当第一个匹配时才考虑第二个数字。

    【讨论】:

    • 非常感谢,我试图通过用逗号分隔两个值来做类似的事情,但忘记用[ ] 包围它们。也不知道您可以使用- 更改订单。非常感谢您的帮助。
    【解决方案2】:

    你试过了吗?

    my_hash.sort_by {|participant_id, values| [values[:diff], values[:points]] }.reverse.to_h
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 2011-10-25
      • 2012-10-24
      • 1970-01-01
      • 2011-02-02
      相关资源
      最近更新 更多