Wenn a
das Array ist, möchte ich a.index(a.max)
, aber etwas mehr Ruby-like. Es sollte offensichtlich sein, aber ich habe Probleme, die Antwort an so und anderswo zu finden. Offensichtlich bin ich Ruby neu.Was ist in Ruby der sauberste Weg, um den Index des größten Wertes in einem Array zu erhalten?
Antwort
für Ruby 1.8.7 oder höher:
a.each_with_index.max[1]
Es tut eine Iteration. Nicht unbedingt die semantischste Sache überhaupt, aber wenn du dich dabei oft vorkommst, würde ich es trotzdem in eine index_of_max
Methode verpacken.
a = [1, 4 8]
a.inject(a[0]) {|max, item| item > max ? item : max }
Mindestens es ist Ruby wie :)
in Ruby 1.9.2 Ich kann dies tun;
arr = [4, 23, 56, 7]
arr.rindex(arr.max) #=> 2
Dies ist im Grunde eine schlechtere Version der unerwünschten ursprünglichen Lösung. – MegaTom
Hier ist, was ich diese Frage zu beantworten, denke:
a = (1..12).to_a.shuffle
# => [8, 11, 9, 4, 10, 7, 3, 6, 5, 12, 1, 2]
a.each_index.max_by { |i| a[i] }
# => 9
Hier ist ein Weg, um alle Indexwerte der Max-Werte zu erhalten, wenn mehr als eine.
Gegeben:
> a
=> [1, 2, 3, 4, 5, 6, 7, 9, 9, 2, 3]
Sie den Index aller Max-Werte finden können (oder einen bestimmten Wert) von:
> a.each_with_index.select {|e, i| e==a.max}.map &:last
=> [7, 8]
Ich wollte nur eine Verhaltens- und Leistungsunterschiede für einige beachten die Lösungen hier. Die "tie brechen" Verhalten von duplizieren max Elemente:
a = [3,1,2,3]
a.each_with_index.max[1]
# => 3
a.index(a.max)
# => 0
Aus Neugier ich sie lief sowohl in Benchmark.bm
(für die a
oben):
user system total real
each_with_index.max 0.000000 0.000000 0.000000 ( 0.000011)
index.max 0.000000 0.000000 0.000000 ( 0.000003)
Dann erzeugt ich ein neues a
mit Array.new(10_000_000) { Random.rand }
und reran den Test:
user system total real
each_with_index.max
2.790000 0.000000 2.790000 ( 2.792399)
index.max 0.470000 0.000000 0.470000 ( 0.467348)
das macht mich denken, es sei denn, Sie müssen speziell den höheren Index max wählen, a.index(a.max)
ist die bessere Wahl.
Ich denke, du hast es. Was ist daran nicht rubinisch? – Ben
Ben, ich war auf der Suche nach etwas wie a.max_index. Raten Sie, dass es nicht eingebaut ist. –
Auch wenn die gewünschte Funktion nicht eingebaut ist, können Sie noch ein '.max_index'-Mitglied zur' Array'-Klasse hinzufügen. Hier ist ein Beispiel für das Erweitern von 'String' oder' Integer' mit einem benutzerdefinierten Mitglied: http://www.hawkee.com/snippet/1260/ – bta