Сортировка по убыванию по значению хэша в Ruby - PullRequest
66 голосов
/ 24 ноября 2010

Мой входной хэш: h = { "a" => 20, "b" => 30, "c" => 10 }

Сортировка по возрастанию: h.sort {|a,b| a[1]<=>b[1]} #=> [["c", 10], ["a", 20], ["b", 30]]

Но мне нужно [["b", 30], ["a", 20], ["c", 10]]

Как мы можем заставить его работать наоборот, что значит <=>?

Ответы [ 4 ]

171 голосов
/ 24 ноября 2010

Вы можете сделать это чище, яснее и быстрее, и все сразу!Например:

h.sort_by {|k,v| v}.reverse

Я сравнил время на 3000 итерациях сортировки 1000-элементного хэша со случайными значениями и получил следующие значения:

h.sort {|x,y| -(x[1]<=>y[1])} -- 16.7s
h.sort {|x,y| y[1] <=> x[1]} -- 12.3s
h.sort_by {|k,v| -v} -- 5.9s
h.sort_by {|k,v| v}.reverse -- 3.7
11 голосов
/ 24 ноября 2010
h.sort {|a,b| b[1]<=>a[1]}
9 голосов
/ 24 ноября 2010

<=> сравнивает два операнда, возвращая -1, если первый ниже, 0, если они равны, и 1, если первый выше.Это означает, что вы можете просто сделать -(a[1]<=>b[1]), чтобы изменить порядок.

7 голосов
/ 21 сентября 2015

Супер просто: h.sort_by { |k, v| -v }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...