Сортировать массив хэшей по значению свойства hash в порядке убывания, сохранив начальный порядок hash - PullRequest
0 голосов
/ 04 июля 2019

У меня есть массив хэшей в ruby.Каждый хэш содержит ключ 'rating', который имеет целочисленное значение.Я хочу отсортировать этот массив по убыванию этого значения.Также должен быть сохранен оригинальный порядок хэшей.Как этого добиться?

Этот код выполняет сортировку, но не сохраняет первоначальный порядок: new_results = results.sort {|a, b| b["rating"] <=> a["rating"]}, где results - массив хэшей.

Если входной массив: results = [ { "rating" => 6, "id" => 10699} , { "rating" => 3, "id" => 19985}, { "rating" => 6, "id" => 1029} ]

Я ожидаю, что new_results будет: [{"rating"=>6, "id"=>10699}, {"rating"=>6, "id"=>1029}, {"rating"=>3, "id"=>19985}]

ПРИМЕЧАНИЕ. Это только для пояснения.С помощью приведенного выше кода мы получаем ожидаемый результат.Но порядок не может быть сохранен обязательно для других примеров, которые я наблюдал.

Сохранение порядка означает, что если два хэша имеют одинаковое значение для rating, то они должны появляться в порядке вкоторые они присутствовали во входном массиве.

1 Ответ

3 голосов
/ 04 июля 2019
results = [
  { "rating"=>6, "id"=>10699 },
  { "rating"=>3, "id"=>19985 },
  { "rating"=>6, "id"=>1029 }
]

results.sort_by.with_index { |h,i| [-h["rating"], i] }
  #=> [{"rating"=>6, "id"=>10699},
  #    {"rating"=>6, "id"=>1029}
  #    {"rating"=>3, "id"=>19985}]

См. Третий абзац документа Array # <=> для объяснения того, как Ruby упорядочивает массивы. Когда Руби заказывает results[0] и results[2], она сравнивает [-6, 0] с [-6, 2]. Поскольку первые элементы этих массивов равны (-6), Ruby сравнивает 0 с 2, чтобы разорвать связь, поэтому results[0] упорядочен до results[2].

Обратите внимание, что когда метод Enumerable # sort_by не имеет блока, он возвращает перечислитель. Здесь этот перечислитель связан с Enumerator # with_index для создания другого перечислителя.

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