#ruby #hash
#ruby #хэш
Вопрос:
У меня есть хэш, который выглядит следующим образом:
{"P1"=>108, "P6"=>50, "P3"=>50, "P5"=>40, "P2"=>40, "P4"=>40}
Это уже отсортировано в порядке убывания значения.
Я хочу вывод ниже, где сохраняется исходный порядок (по убыванию значения), но элементы с одинаковыми значениями сортируются в порядке возрастания ключей (например, P3
идет перед P6
).
{"P1"=>108, "P3"=>50, "P6"=>50, "P2"=>40, "P4"=>40, "P5"=>40 }
Любые указания на то, как подойти к этому простым способом, были бы полезны.
Ответ №1:
Для нескольких условий сортировки используйте массив.
{"P1"=>108, "P6"=>50, "P3"=>50, "P5"=>40, "P2"=>40, "P4"=>40}
.sort_by{|k, v| [-v, k]}.to_h
Комментарии:
1. @sawa: Спасибо за ваш ответ. Не могли бы вы объяснить свой подход немного подробнее, особенно
[-v, k]
часть, или, если бы вы могли указать мне на какой-нибудь пример статьи, в которой объясняется то же самое, даже это помогло бы. Я просмотрел документацию по sort_by , но это не сильно помогло.2. У каждого класса есть свое собственное определение
<=>
, которое используется при сортировке. Для массивов его элементы сравниваются с первого. Если они не связаны, то это будет результатом сравнения. Если есть связь, то сравниваются следующие элементы. И так далее.-v
Используется тот факт, что значение является цифрой. Отрицание цифры приводит к тому же эффекту, что и сортировка по убыванию.3. @sawa Пожалуйста, извините за мой поздний ответ. Я понял из вашего объяснения, что -v рассмотрит возможность упорядочивания значений хэша в порядке убывания, но мне не очень понятно, как работает сортировка, когда ключи хэша имеют одинаковое значение. В таком сценарии сортируются ли пары ключ-значение в порядке возрастания ключей по умолчанию? Если да, какая часть вашего ответа на код указывает ruby на это?. Кроме того, из любопытства, если я хочу отсортировать пары ключ-значение, которые имеют одинаковое значение элемента в порядке убывания, но сохраняют исходный порядок убывания значений, как я могу этого добиться? Спасибо.