我有以下嵌套的散列结构:
{12 => {:points=>0, :diff=>0},
1=> {:points=>18, :diff=>57},
4=>{:points=>12, :diff=>67},
5=>{:points=>9, :diff=>62}}我想先按点(降)和差(升)排序。
我只能使用以下方法对其进行排序:
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,而其他情况似乎不符合我的目的。你能帮我找到解决办法吗?
发布于 2018-06-26 11:41:09
我会这么做:
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]]。注意- at -v[:points],这将导致降序。只有在第一次比赛时才考虑第二个号码。
发布于 2018-06-26 11:38:56
你试过这个吗。
my_hash.sort_by {|participant_id, values| [values[:diff], values[:points]] }.reverse.to_hhttps://stackoverflow.com/questions/51041912
复制相似问题