2011-01-27 30 views
6

Cách tốt nhất (làm đẹp và hiệu quả về hiệu suất) là gì để lặp qua nhiều mảng trong Ruby? Hãy nói rằng chúng ta có một mảng:Cách tốt nhất để lặp qua nhiều mảng?

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

và tôi muốn điều này:

x a 
y b 
z c 

Cảm ơn.

+0

có thể trùng lặp của [Cách 'Ruby là gì' để lặp qua hai mảng cùng một lúc] (http://stackoverflow.com/questions/3580049/whats-the-ruby-way-to-iterate-over -two-arrays-at-once) – Vache

Trả lời

3

Phương pháp zip trên các đối tượng mảng:

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

Bạn cũng có thể một cái gì đó như 'a.zip (b) {| đầu tiên, thứ hai | p [đầu tiên, thứ hai]} 'thay vì lập chỉ mục' mục'. –

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

Một thay thế là sử dụng each_with_index. Một điểm chuẩn nhanh chóng cho thấy rằng điều này là hơi nhanh hơn so với sử dụng zip.

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

Benchmark:

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 

Kết quả:

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

Đây có phải là MRI (1.8) hoặc YARV (1.9) không? –

+0

ruby ​​1.9.2p136 (2010-12-25 bản sửa đổi 30365) [x86_64-darwin10.6.0] –

1

Tôi thích sử dụng transpose khi lặp lại qua nhiều mảng sử dụng Ruby. Hi vọng điêu nay co ich.

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 
Các vấn đề liên quan