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?
risposta
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
.
a = [1, 4 8]
a.inject(a[0]) {|max, item| item > max ? item : max }
almeno è Ruby-simile :)
In ruby 1.9.2 posso fare questo;
arr = [4, 23, 56, 7]
arr.rindex(arr.max) #=> 2
Questa è fondamentalmente una versione peggiore della soluzione originale indesiderata. – MegaTom
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
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]
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.
Penso che ce l'abbia. Cosa c'è di non rubino a riguardo? – Ben
Ben, stavo cercando qualcosa come a.max_index. Indovina che non è incorporato. –
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