2010-01-27 11 views
43

Si a es la matriz, quiero a.index(a.max), pero algo más similar a Ruby. Debería ser obvio, pero estoy teniendo problemas para encontrar la respuesta en eso y en otros lugares. Obviamente, soy nuevo para Ruby.En Ruby, ¿cuál es la forma más limpia de obtener el índice del valor más grande en una matriz?

+2

Creo que lo tienes. Lo que no es rubí sobre eso? – Ben

+0

Ben, estaba buscando algo así como a.max_index. Supongo que no está integrado. –

+1

Incluso si la función que desea no está incorporada, puede agregar un miembro '.max_index' a la clase' Array'. Aquí hay un ejemplo de la extensión de 'String' o' Integer' con un miembro personalizado: http://www.hawkee.com/snippet/1260/ – bta

Respuesta

99

para Ruby 1.8.7 o superior:

a.each_with_index.max[1] 

Se hace una iteración. No es del todo la cosa más semántica, pero si te encuentras haciendo esto mucho, lo envolvería en un método index_of_max de todos modos.

+0

Wow. ¿Cómo hace esto lo que hace? –

+2

De acuerdo, ¿cómo funciona este? – bergyman

+0

Aaah, lo tengo. each_with_index.max devuelve una matriz con el primer elemento que es el valor y el segundo es el índice de la misma. Muy bien, Chuck. – bergyman

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

por lo menos es como Rubí-:)

+0

¡Maldición! Estaba cocinando una solución usando inyección, ¡me ganaste! ;) – bergyman

+2

Además, la pregunta original era obtener el índice, por lo que tendría que cambiarse a: a.inject (0) {| index, num | num> a [índice]? a.find_index (num): index} – bergyman

14

En Ruby 1.9.2 Puedo hacer esto;

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

Esto es básicamente una versión peor de la solución original no deseada. – MegaTom

6

Aquí es lo que estoy pensando para responder a esta pregunta: ¿

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

que aquí hay una manera de recibir todos los valores del índice de los valores máximos si hay más de uno.

Dado:

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

Puede encontrar el índice de todos los valores máximos (o cualquier valor dado) por:

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

Sólo quería señalar una diferencia de comportamiento y el rendimiento de algunos de las soluciones aquí. El "desempate" comportamiento de duplicar elementos max:

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

Por curiosidad a los dos corriendo en Benchmark.bm (para el a arriba):

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) 

Entonces me genera un nuevo a con Array.new(10_000_000) { Random.rand } y volvió a ejecutar la prueba:

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) 

Esto me hace pensar menos específicamente debe elegir el índice más alto max, a.index(a.max) es la mejor opción.

Cuestiones relacionadas