2010-01-27 13 views
43

Se a è l'array, voglio a.index(a.max), ma qualcosa di più simile a Ruby. Dovrebbe essere ovvio, ma ho difficoltà a trovare la risposta in questo e altrove. Ovviamente, sono nuovo di Ruby.In Ruby, qual è il modo più pulito per ottenere l'indice del valore più grande in un array?

+2

Penso che ce l'abbia. Cosa c'è di non rubino a riguardo? – Ben

+0

Ben, stavo cercando qualcosa come a.max_index. Indovina che non è incorporato. –

+1

Anche se la funzione che desideri non è incorporata, puoi comunque aggiungere un membro '.max_index' alla classe' Array'. Ecco un esempio di estensione di 'String' o' Integer' con un membro personalizzato: http://www.hawkee.com/snippet/1260/ – bta

risposta

99

Per rubino 1.8.7 o superiore:

a.each_with_index.max[1] 

Fa un'iterazione. Non del tutto la cosa più semantica di sempre, ma se ti ritrovi a fare questo molto, lo avvolgerei comunque in un metodo index_of_max.

+0

Wow. Come fa questo a fare quello che fa? –

+2

concordato: come funziona? – bergyman

+0

Aaah, capito. each_with_index.max restituisce una matrice con il primo elemento come valore e il secondo come indice. Molto carino, Chuck. – bergyman

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

almeno è Ruby-simile :)

+0

Dannazione! Stavo cucinando una soluzione con l'iniezione - mi hai battuto! ;) – bergyman

+2

Inoltre, la domanda originale era di ottenere l'indice, quindi questo dovrebbe essere modificato in: a.inject (0) {| index, num | num> a [indice]? a.find_index (num): indice} – bergyman

14

In ruby ​​1.9.2 posso fare questo;

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

Questa è fondamentalmente una versione peggiore della soluzione originale indesiderata. – MegaTom

6

Ecco quello che sto pensando di rispondere a questa domanda:

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

Ecco un modo per ottenere tutti i valori di indice dei valori massimi se più di uno.

Data:

> a 
=> [1, 2, 3, 4, 5, 6, 7, 9, 9, 2, 3] 

È possibile trovare l'indice di tutti i valori massimi (o qualsiasi dato valore) da:

> a.each_with_index.select {|e, i| e==a.max}.map &:last 
=> [7, 8] 
1

Volevo solo sottolineare una differenza comportamentale e prestazioni per alcuni dei le soluzioni qui. La "cravatta spezzare" il comportamento di duplicare elementi max:

a = [3,1,2,3] 
a.each_with_index.max[1] 
# => 3 
a.index(a.max) 
# => 0 

Per curiosità ho entrambi imbattuto in Benchmark.bm (per il a sopra):

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) 

Poi ho generato un nuovo a con Array.new(10_000_000) { Random.rand } e reran il 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) 

Questo mi fa pensare a meno hai specificamente bisogno di scegliere il massimo indice massimo, a.index(a.max) è la scelta migliore.

Problemi correlati