2010-09-29 23 views
11

¿Cómo puedo buscar el siguiente elemento y antes de la matriz al iterar la matriz con cada uno.Iterar sobre una matriz y devolver la siguiente y el elemento antes de la actual

array.each do |a| 
    # I want to fetch next and before current element. 
end 
+1

Dos preguntas: 1) ¿Cuál es el "anterior" elemento al principio y el elemento "siguiente" al final? 2) ¿Debería el elemento 'next' ser el elemento' current' de la siguiente iteración (es decir, después del grupo '[ar [4], ar [5], ar [6]]', debería ser el siguiente grupo ' [ar [5], ar [6], ar [7]] 'o' [ar [7], ar [8], ar [9]] ')? – Chuck

Respuesta

34

mirada tomar por lo Enumerable#each_cons método:

[nil, *array, nil].each_cons(3){|prev, curr, nxt| 
    puts "prev: #{prev} curr: #{curr} next: #{nxt}" 
} 

prev: curr: a next: b 
prev: a curr: b next: c 
prev: b curr: c next: 

Si se quiere, se puede envolver en el nuevo método de matriz:

class Array 
    def each_with_prev_next &block 
    [nil, *self, nil].each_cons(3, &block) 
    end 
end 
#=> nil 

array.each_with_prev_next do |prev, curr, nxt| 
    puts "prev: #{prev} curr: #{curr} next: #{nxt}" 
end 
+3

¿Qué tal '' nil, * array, nil] 'en lugar de' [nil] + array + [nil] '? –

+0

¡Genial! Odio la variante '+', pero pensé que no había nada más bonito. Actualizaré la respuesta si no te importa. –

+0

si alguien está buscando una forma de "mapear" los elementos en lugar de simplemente iterar sobre ellos puede hacer algo como '1..9) .each_cons (2) .map {| a | a} ' – equivalent8

9

Puede utilizar Enumerable#each_with_index para obtener el índice de cada elemento como iterar, y usarlo para obtener los elementos circundantes.

array.each_with_index do |a, i| 
    prev_element = array[i-1] unless i == 0 
    next_element = array[i+1] unless i == array.size - 1 
end 
Cuestiones relacionadas