Suchen des Elements eines Ruby-Arrays mit dem Maximalwert für ein bestimmtes Attribut

83

Es gibt wahrscheinlich eine sehr einfache Antwort auf diese Frage, aber ich kann es für mein ganzes Leben im Moment nicht herausfinden. Wenn ich ein Ruby-Array eines bestimmten Objekttyps habe und alle ein bestimmtes Feld haben, wie finde ich das Element des Arrays, das den größten Wert für dieses Feld hat?

Richard Stokes
quelle
mögliches Duplikat der prägnanteren Version von max / min ohne den Block
Andrew Grimm

Antworten:

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

Oder:

array.max_by(&:field)
David Grayson
quelle
Weitere hilfreiche Methoden finden Sie in der Dokumentation des Moduls Enumerable.
David Grayson
29

Hilft das?

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

(Ich gehe davon aus, dass Ihr Feld einen Namen hat attr)

p.matsinopoulos
quelle
Ja, genau das habe ich gesucht, die Array-API durchsucht und nichts gefunden. Vergessen Sie, die API auf Enumberable zu überprüfen. Danke!
Richard Stokes
1
Überprüfen Sie immer die Enumerable-API. Es hat alles was Sie brauchen und das Spülbecken!
Sahil Muthoo
2
Ich bevorzuge die Verwendung, max_byda die Verwendung einfacher ist: Der Block akzeptiert nur ein einziges Argument und Sie müssen den <=>Operator spacehip ( ) nicht explizit verwenden .
David Grayson
@ DavidGrayson Danke für die Info. Ich wusste nicht, dass es diese Methode gibt. Ich werde über Ihren Kommentar und Ihre Antwort abstimmen.
p.matsinopoulos
3

Sie können das Array auch sortieren und dann den maximalen, minimalen, zweitgrößten Wert usw. erhalten.

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

puts hash[0]["key"]
Linju
quelle
2
Wenn Sie nur auf Minimum oder Maximum setzen, sind die Algorithmen O(n). Die Sortierung erfolgt nach Minimum O(n log n). Verwenden Sie dies nur, wenn Sie dies benötigen, da es zu unnötigen Leistungsverlusten kommt.
Jamie
1
Wahr. Sortieren ist ein Overkill, nur um max. Ich habe dies hinzugefügt, falls jemand den zweitgrößten, drittgrößten usw. erhalten möchte.
Linju