Нахождение элемента массива Ruby с максимальным значением для определенного атрибута

85

На этот вопрос, вероятно, есть очень простой ответ, но я не могу понять его в данный момент. Если у меня есть рубиновый массив объектов определенного типа, и все они имеют определенное поле, как мне найти элемент массива, который имеет наибольшее значение для этого поля?

Ричард Стоукс
источник
Возможный дубликат Более сжатой версии max / min без блока
Эндрю Гримм

Ответы:

157
array.max_by do |element|
  element.field
end

Или же:

array.max_by(&:field)
Дэвид Грейсон
источник
Обратитесь к документации модуля Enumerable для получения более полезных методов.
Дэвид Грейсон
29

Это помогает?

my_array.max {|a,b| a.attr <=> b.attr }

(Я предполагаю, что у вашего поля есть имя attr)

п. мацинопулос
источник
Да, это именно то, что я искал, рылся в Array api и ничего не нашел, забыл проверить api для Enumberable, спасибо!
Ричард Стоукс
1
Всегда проверяйте Enumerable API. В нем есть все необходимое и кухонная мойка!
Сахил Муту
2
Я предпочитаю использовать, max_byпотому что его проще использовать: блок принимает только один аргумент, и вам не нужно явно использовать <=>оператор spacehip ( ).
Дэвид Грейсон
@DavidGrayson Спасибо за информацию. Я не знал о существовании этого метода. Проголосую за ваш комментарий и ответ.
p.matsinopoulos 08
3

Вы также можете отсортировать массив, а затем получить максимальное, минимальное, второе по величине значение и т. Д.

array = array.sort_by {|k,v| v}.reverse

puts hash[0]["key"]
Линджу
источник
2
Если вы просто стремитесь к минимуму или максимуму, алгоритмы таковы O(n). Сортировка по минимуму O(n log n). Не используйте это, если вам не нужно, так как есть некоторые ненужные потери производительности.
Джейми
1
Правда. Сортировка - это перебор, чтобы получить максимум. Я добавил это на случай, если кто-то захочет получить 2-й по величине, 3-й по величине и т. Д.
Линджу