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?


Antworten:


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

Oder:

array.max_by(&:field)

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)


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"]

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.