2010-08-24 7 views
13

Array#find_index permite encontrar el índice del primer elemento que sea¿Hay un equivalente de Array # find_index para el último índice en ruby?

  • es igual a un object o
  • hace un bloque que se le pasa como resultado true

Array#rindex puede permitir para encontrar el índice del último artículo que es igual a object, pero ¿hay algo que le permita encontrar el índice del último artículo que hace que un bloque pasado le devuelva verdadero?

De lo contrario, debería hacer algo como

last_index = array.length - 1 - array.reverse.find_index{|item| item.is_wanted?} 

Respuesta

2

una pena, se trata hasta 1.9.2. Mientras tanto, si usted no desea invertir la matriz, sino más bien enumerar la búsqueda a la inversa, se puede hacer

last_index = array.length - 1 - array.rindex.find_index{|item| item.is_wanted? } (1.8.7 en adelante)

0

Se podría hacer una mejora marginal en la concisión su solución mediante la eliminación de a.length, como índices negativos cuentan desde el extremo de la cadena en []

irb(main):015:0> a=[1,2,nil,6,8,nil,9,nil,10,11,12] 
=> [1, 2, nil, 6, 8, nil, 9, nil, 10, 11, 12] 
irb(main):016:0> -(a.reverse.index(nil)+1) 
=> -4 
irb(main):017:0> a[-4] 
=> nil 

todavía parece terriblemente ineficaz para revertir la matriz completa cuando todo lo que quiere hacer es iterar hacia atrás a través de él, pero esa es su opinión sobre la eficiencia frente a la estética

+0

Dicho esto, yo prefiero respuesta chubas. No noté el rindex allí ... – telent

+0

+1 muy inteligente ... – Anurag

+0

quien sea que haya votado negativamente esta respuesta, ¿cuál es exactamente su objeción? – telent

1

O usted podría hacer algo como

last_index = array.map {|i| i.is_wanted? }.rindex(true) 

que es un poco más bonita

0

Esto es ligeramente fuera de tema, pero en cualquier momento que tenga una colección con un tamaño y desea que el resultado de otro tamaño que usted pueda usar inyectar La mayoría de las veces evita operaciones de bucle innecesarias en la colección de entrada.

Por ejemplo, si quiero encontrar el índice del último nula:

a = [1,2,nil,6,8,nil,9,nil,10,11,12] 
# => [1, 2, nil, 6, 8, nil, 9, nil, 10, 11, 12] 
a.inject([-1, nil]){|(current_index, matched), value| current_index += 1; matched = current_index if value.nil?; [current_index, matched]}.last 
# => 7 
Cuestiones relacionadas