Подтвердить что ты не робот

Descending сортировать по значению хеша в Ruby

Мой входной хэш: 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]]

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

4b9b3361

Ответ 1

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

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

Ответ 2

h.sort {|a,b| b[1]<=>a[1]}

Ответ 3

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

Ответ 4

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