Znalezienie elementu tablicy Ruby z maksymalną wartością określonego atrybutu

85

Prawdopodobnie jest bardzo prosta odpowiedź na to pytanie, ale w tej chwili nie mogę tego rozgryźć. Jeśli mam tablicę ruby ​​określonego typu obiektów i wszystkie mają określone pole, jak znaleźć element tablicy, który ma największą wartość dla tego pola?

Richard Stokes
źródło
możliwy duplikat Bardziej zwięzłej wersji max / min bez blokady
Andrew Grimm

Odpowiedzi:

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

Lub:

array.max_by(&:field)
David Grayson
źródło
Więcej pomocnych metod znajdziesz w dokumentacji modułu Enumerable.
David Grayson
29

czy to pomaga?

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

(Zakładam, że twoje pole ma nazwę attr)

p.matsinopoulos
źródło
Tak, właśnie tego szukałem, przeszukiwałem interfejs API Array i nie mogłem niczego znaleźć, zapomnij sprawdzić interfejs API dla Enumberable, dzięki!
Richard Stokes
1
Zawsze sprawdzaj Enumerable API. Ma wszystko, czego potrzebujesz i zlew kuchenny!
Sahil Muthoo,
2
Wolę używać, max_byponieważ jest prostszy w użyciu: blok przyjmuje tylko jeden argument i nie musisz jawnie używać <=>operatora statku kosmicznego ( ).
David Grayson
@DavidGrayson Dzięki za informację. Nie wiedziałem o istnieniu tej metody. Zagłosuję za Twoim komentarzem i odpowiedzą.
p.matsinopoulos
3

Możesz również posortować tablicę, a następnie uzyskać maksymalną, minimalną, drugą co do wielkości wartość itp.

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

puts hash[0]["key"]
Linju
źródło
2
Jeśli wybierasz minimum lub maksimum, algorytmy są O(n). Sortowanie odbywa się według minimum O(n log n). Nie używaj tego, chyba że musisz, ponieważ występują niepotrzebne straty wydajności.
Jamie
1
Prawdziwe. Sortowanie to przesada, aby uzyskać maks. Dodałem to na wypadek, gdyby ktoś chciał uzyskać drugą co do wielkości, trzecią co do wielkości itp.
Linju