2010-01-27 9 views
43

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?

+2

Ich denke, du hast es. Was ist daran nicht rubinisch? – Ben

+0

Ben, ich war auf der Suche nach etwas wie a.max_index. Raten Sie, dass es nicht eingebaut ist. –

+1

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

Antwort

99

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.

+0

Wow. Wie macht das, was es macht? –

+2

Einverstanden - wie funktioniert das? – bergyman

+0

Aaah, hab es. each_with_index.max gibt ein Array zurück, wobei das erste Element der Wert und das zweite der Index ist. Sehr nett, Chuck. – bergyman

2
a = [1, 4 8] 
a.inject(a[0]) {|max, item| item > max ? item : max } 

Mindestens es ist Ruby wie :)

+0

Verdammt! Ich habe mit inject eine Lösung gekocht - du hast mich dazu geschlagen! ;) – bergyman

+2

Auch - ursprüngliche Frage war, den Index zu bekommen, so dass dies geändert werden müsste: a.inject (0) {| index, num | num> a [Index]? a.find_index (num): index} – bergyman

14

in Ruby 1.9.2 Ich kann dies tun;

arr = [4, 23, 56, 7] 
arr.rindex(arr.max) #=> 2 
+0

Dies ist im Grunde eine schlechtere Version der unerwünschten ursprünglichen Lösung. – MegaTom

6

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 
1

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

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.

Verwandte Themen