2011-01-27 16 views
6

¿Cuál es la mejor (belleza y eficiencia en términos de rendimiento) para iterar en varias matrices en Ruby? Digamos que tenemos un matrices:¿La mejor manera de iterar en varias matrices?

a=[x,y,z] 
b=['a','b','c'] 

y quiero esto:

x a 
y b 
z c 

Gracias.

+0

posible duplicado de [¿Cuál es la 'Rubí camino' para iterar sobre dos matrices al tiempo] (http://stackoverflow.com/questions/3580049/whats-the-ruby-way-to-iterate-over -two-arrays-at-once) – Vache

Respuesta

3

El método zip en objetos de matriz:

a.zip b do |items| 
    puts items[0], items[1] 
end 
+3

También podría ser algo como 'a.zip (b) {| primero, segundo | p [first, second]} 'en vez de indexar' items'. –

2
>> a=["x","y","z"] 
=> ["x", "y", "z"] 
>> b=["a","b","c"] 
=> ["a", "b", "c"] 
>> a.zip(b) 
=> [["x", "a"], ["y", "b"], ["z", "c"]] 
>> 
6

Una alternativa es usar each_with_index. Un punto de referencia rápido muestra que esto es ligeramente más rápido que usar zip.

a.each_with_index do |item, index| 
    puts item, b[index] 
end 

puntos de referencia:

a = ["x","y","z"] 
b = ["a","b","c"] 

Benchmark.bm do |bm| 
    bm.report("ewi") do 
    10_000_000.times do 
     a.each_with_index do |item, index| 
     item_a = item 
     item_b = b[index] 
     end 
    end 
    end 
    bm.report("zip") do 
    10_000_000.times do 
     a.zip(b) do |items| 
     item_a = items[0] 
     item_b = items[1] 
     end 
    end 
    end 
end 

Resultados:

 user  system  total  real 
ewi 7.890000 0.000000 7.890000 ( 7.887574) 
zip 10.920000 0.010000 10.930000 (10.918568) 
+0

¿Estaba esto debajo de MRI (1.8) o YARV (1.9)? –

+0

ruby ​​1.9.2p136 (2010-12-25 revisión 30365) [x86_64-darwin10.6.0] –

1

me gusta usar transposición cuando se repite a través de múltiples matrices usando Ruby. Espero que esto ayude.

bigarray = [] 
bigarray << array_1 
bigarray << array_2 
bigarray << array_3 
variableName = bigarray.transpose 

variableName.each do |item1,item2,item3| 

# do stuff per item 
# eg 
puts "item1" 
puts "item2" 
puts "item3" 

end 
Cuestiones relacionadas