按Ruby中的多个值对嵌套哈希排序

时间:2018-06-26 11:33:30

标签: ruby sorting hash

我具有以下嵌套的哈希结构:

{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,而其他情况似乎不符合我的目的。您能帮忙找到解决方案吗?

2 个答案:

答案 0 :(得分: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]导致降序排列。如果第一个匹配,则仅考虑第二个数字。

答案 1 :(得分:0)

您尝试过吗

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