Сортировка вложенных хэшей по нескольким значениям в ruby - PullRequest
0 голосов
/ 26 июня 2018

У меня есть следующая вложенная хеш-структура:

{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 , а другие случаи, кажется, не соответствуют моей цели. Не могли бы вы помочь найти решение?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Я бы сделал это:

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], что приводит к нисходящему порядку. Второе число учитывается только при первом совпадении.

0 голосов
/ 26 июня 2018

Вы пробовали это.

my_hash.sort_by {|participant_id, values| [values[:diff], values[:points]] }.reverse.to_h
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...