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?

obuzek
quelle

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]
theIV
quelle
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.

Diego Dias
quelle
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.

Dave Morse
quelle
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
2
Dies ist Mikrooptimierung
Andre Figueiredo
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]
Aaron-Codierung
quelle
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.

HamsterMuffin
quelle
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
Almokhtar bekkour
quelle
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