我具有以下嵌套的哈希结构:
{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,而其他情况似乎不符合我的目的。您能帮忙找到解决方案吗?
答案 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