Сортировка хэша, имеющего повторяющиеся значения, в порядке возрастания ключей

#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 на это?. Кроме того, из любопытства, если я хочу отсортировать пары ключ-значение, которые имеют одинаковое значение элемента в порядке убывания, но сохраняют исходный порядок убывания значений, как я могу этого добиться? Спасибо.