2011-01-27 27 views
6

Ruby'de birden fazla dizi üzerinde yineleme yapmak için en iyi (performans açısından güzel ve verimli) yolu nedir? ismindeki bir dizi var diyelim:Birden çok dizi üzerinde yineleme için en iyi yol?

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

ve bunu istiyorum:

x a 
y b 
z c 

teşekkür ederiz.

+0

olası yinelenen [ 'Ruby yolu' aynı anda iki dizide üzerinde ne yinelemenizi oluyor] (http://stackoverflow.com/questions/3580049/whats-the-ruby-way-to-iterate-over -two-dizileri-bir kerede) – Vache

cevap

3

zip yöntem bakınız:

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

Aynı zamanda bir şey olabilirsiniz, a.zip (b) {| birinci, ikinci | p [ilk, ikinci]} '' item'leri indekslemek yerine. –

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

alternatif bir each_with_index kullanıyor. Hızlı bir kıyaslama, bunun zip kullanılmasından biraz daha hızlı olduğunu gösteriyor.

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

Deney:

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 

Sonuçlar:

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

Bu, MRI (1.8) veya YARV (1.9) altında mıydı? –

+0

ruby ​​1.9.2p136 (2010-12-25 düzeltme 30365) [x86_64-darwin10.6.0] –

1

Ruby kullanarak birden fazla diziler aracılığıyla ilerlerken devrik kullanmak ister. Bu yardımcı olur umarım. arasında

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 
İlgili konular