So finden Sie mit Ruby ein Min / Max


413

Ich möchte verwenden min(5,10), oder Math.max(4,7). Gibt es entsprechende Funktionen in Ruby?

Antworten:


721

Du kannst tun

[5, 10].min

oder

[4, 7].max

Sie kommen aus dem Enumerable-Modul , also alles, was dazu gehörtEnumerable alle enthaltenen Methoden diese Methoden verfügbar sind.

v2.4 führt eigene Array#minund ein Array#max, die viel schneller sind als die Methoden von Enumerable, da sie das Aufrufen überspringen#each .

@nicholasklick erwähnt eine andere Option, Enumerable#minmaxgibt aber diesmal ein Array von zurück [min, max].

[4, 5, 7, 10].minmax
=> [4, 10]

3
@kaz Ich bin nicht sicher, ob ich deinen Kommentar verstehe.
Ziggy

3
@Kaz ... Sie erkennen, std::max(4, 7)hat mehr "Interpunktion" als [4, 7].max?
Tckmn

3
@Doorknob Sie erkennen, dass std::maxdies in Ihren Namespace importiert werden kann, so dass es einfach wird max(4, 7). Warten; Wenn ich nach oben schaue, sehe ich, dass ich das schon gesagt habe.
Kaz

18
Interpunktion ist hier nicht das Problem. Eine ganze Heap-Zuordnung, um das Maximum von wenigen Werten zu erhalten, ist hier die zugrunde liegende Hässlichkeit.
Kdbanman

7
Ruby ist hauptsächlich für den Programmierer gedacht, nicht für den Computer. In Matz 'Worten: "Ich hoffe, dass Ruby jedem Programmierer auf der Welt hilft, produktiv zu sein, Spaß am Programmieren zu haben und glücklich zu sein. Das ist der Hauptzweck der Ruby-Sprache." Das ist von der Wikipedia-Seite auf Ruby.
Aaron-Codierung

52

Sie können verwenden

[5,10].min 

oder

[4,7].max

Es ist eine Methode für Arrays.


20
Technisch gesehen ist es eine Methode für Enumerables, nicht für Arrays.
Meagar

1
Es ist eine Methode für Arrays mit überlegener Leistung gegenüber Enumerable seit v2.4
Andre Figueiredo

25

All diese Ergebnisse erzeugen Müll in einem eifrigen Versuch, mehr als zwei Argumente zu verarbeiten. Ich wäre gespannt, wie sie sich im Vergleich zu guten alten Leuten verhalten:

def max (a,b)
  a>b ? a : b
end

Das ist übrigens meine offizielle Antwort auf Ihre Frage.


Es gibt einige Gerüchte, die Ruby 2.4 optimiert [a,b].max, aber es ist immer noch nicht klar, ob es schneller als die obige Implementierung ist. blog.bigbinary.com/2016/11/17/…
Dave Morse


1
Berücksichtigt diese Profilerstellung die in GC verbrachte Zeit?
Dave Morse

20

Wenn Sie das Maximum / Min eines Hashs ermitteln müssen, können Sie #max_byoder verwenden#min_by

people = {'joe' => 21, 'bill' => 35, 'sally' => 24}

people.min_by { |name, age| age } #=> ["joe", 21]
people.max_by { |name, age| age } #=> ["bill", 35]

20

Wenn Sie zusätzlich zu den bereitgestellten Antworten Enumerable # max in eine max-Methode konvertieren möchten , die wie in einigen anderen Programmiersprachen eine variable Nummer oder Argumente aufrufen kann, können Sie Folgendes schreiben:

def max(*values)
 values.max
end

Ausgabe:

max(7, 1234, 9, -78, 156)
=> 1234

Dies missbraucht die Eigenschaften des Splat-Operators, um ein Array-Objekt zu erstellen, das alle angegebenen Argumente enthält, oder ein leeres Array-Objekt, wenn keine Argumente angegeben wurden. Im letzteren Fall wird die Methode zurückgegeben nil, da der Aufruf von Enumerable # max für ein leeres Array-Objekt zurückgegeben wird nil.

Wenn Sie diese Methode im Math-Modul definieren möchten, sollte dies den Trick tun:

module Math
 def self.max(*values)
  values.max
 end
end

Beachten Sie, dass Enumerable.max im Vergleich zum ternären Operator ( ?:) mindestens zweimal langsamer ist . In der Antwort von Dave Morse finden Sie eine einfachere und schnellere Methode.


Aber wird das Wiedereröffnen von Standardklassen und -modulen nicht als schlechte Praxis angesehen?
Radiantshaw

-2
def find_largest_num(nums)
  nums.sort[-1]
end

Das Sortieren nach dem Maximum / Minimum ist verschwenderisch. Das Finden von min / max ist O (n), während das Sortieren O (n log (n)) ist.
Itamar Mushkin
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.