Сортировка хэша в ruby ​​по значению, а затем по ключу - PullRequest
5 голосов
/ 13 декабря 2010

Как вы сортируете хеш в ruby ​​на основе значения, а затем ключа? Например

h = {4 => 5, 2 => 5, 7 => 1}

будет сортироваться в

[[7, 1], [2,5], [4, 5]]

Я могу отсортировать по значению, выполнив

h.sort {|x,y| x[1] <=> y[1]}

но я не могу понять, как сортировать по значению, а затем ввести ключ, если значения совпадают

1 Ответ

14 голосов
/ 13 декабря 2010
h.sort_by {|k, v| [v, k] }

Используется тот факт, что Array смешивается в Comparable и определяет <=> поэлементно.

Обратите внимание, что вышеприведенное эквивалентно

h.sort_by {|el| el.reverse }

что эквивалентно

h.sort_by(&:reverse)

, которое может быть или не быть более читабельным.

Если вы знаете , что Hash обычно сначала сортируют по ключу, а затем поЗначение вышеизложенного должно быть очевидным.Может быть, с небольшим комментарием:

h.sort_by(&:reverse) # sort by value first, then by key

Примечание: если вы просто хотите делегировать методу <=> какого-либо свойства (т.е. сортировать по ключу, а не функции общего сравнения), обычно этопредпочтительнее использовать sort_by вместо sort.Это намного легче читать.Как правило, это также происходит быстрее, но аспект читабельности является более важным.

Вы действительно должны написать свою собственную функцию сравнения, только если абсолютно необходимо.

Итак, ваш нерабочий пример лучше записать как

h.sort_by {|el| el[1] }

Лично я предпочитаю использовать деструктурирующую привязку в списке параметров блока вместо el[0] и el[1]:

h.sort_by {|key, value| value }

Однако, в данном конкретном случае, el[1] также оказывается идентичным el.last, так что вы можете просто написать

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