2012-05-17 135 views
0

你可以有一個ruby for循環有兩個索引嗎? 即:Ruby中的兩個索引for循環

for i,j in 0..100 
    do something 
end 

在谷歌

找不到任何

編輯:添加更多的細節

我需要比較兩個不同的陣列,像這樣

Index: Array1: Array2: 

    0  a  a 
    1  a  b 
    2  a  b 
    3  a  b 
    4  b  b 
    5  c  b 
    6  d  b 
    7  d  b 
    8  e  c 
    9  e  d 
    10  e  d 
    11    e 
    12    e 

但知道他們都有相同的項目(abcde) 這是我的僞邏輯,讓我們假設整個事情是在一個循環內

#tese two if states are for handling end-of-array cases 
If Array1[index_a1] == nil 
    Errors += Array1[index_a1-1] 
    break 
If Array2[index_a1] == nil 
    Errors += Array2[index_a2-1] 
    break 

#this is for handling mismach 
If Array1[index_a1] != Array2[index_a2] 

    Errors += Array1[index_a1-1] #of course, first entry of array will always be same 

    if Array1[index_a1] != Array1[index_a1 - 1] 
     index_a2++ until Array1[index_a1] == Array2[index_a2] 
     index_a2 -=1 (these two lines are for the loop's sake in next iteration) 
     index_a1 -=1 

    if Array2[index_a2] != Array2[index_a2 - 1] 
     index_a1++ until Array1[index_a1] == Array2[index_a2] 
     index_a2 -=1 (these two lines are for the loop's sake in next iteration) 
     index_a1 -=1 

概括地說,在上述例子中,

Errors looks like this 
a,b,e 

作爲c和d是好的。

+2

你真的需要這個循環嗎?你想要實現什麼?無論如何,使用統計員會是更好的方法。 – Flexoid

+0

它沒有任何意義。你想做什麼?如果您只想要獨立索引,請使用索引和「常規」變量。 –

+0

我正在同時循環兩個數組並對它們進行比較。我需要不同的索引,因爲有時我需要跳過其中一個數組中的幾個元素 – mhz

回答

2

for循環不是在Ruby中迭代數組的最佳方法。澄清你的問題後,我認爲你有一些可能的策略。

你有兩個數組,a和b。 如果兩個數組的長度相同:

a.each_index do |index| 
if a[index] == b[index] 
    do something 
else 
    do something else 
end 
end 

這也適用,如果A比B短。

如果你不知道哪一個是短,你可以寫這樣的:

controlArray = a.length < b.length ? a : b來分配controlArray,使用controlArray.each_index。或者你可以使用(0..[a.length, b.length].min).each{|index| ...}來完成同樣的事情。


尋找你的編輯你的問題,我想我能夠改寫這樣的:給出重複一個數組,我怎麼能獲得每個項目的數量每個陣列中,並比較計數?在你的情況,我認爲這樣做最簡單的方法是這樣的:

a = [:a,:a,:a,:b,:b,:c,:c,:d,:e,:e,:e] 
b = [:a,:a,:b,:b,:b,:c,:c,:c,:d,:e,:e,:e] 
not_alike = [] 
a.uniq.each{|value| not_alike << value if a.count(value) != b.count(value)} 
not_alike 

運行的代碼給我[:a,:b,:c]

如果有可能a不包含每個符號,那麼您將需要一個數組,其中包含符號並使用該數組代替a.uniq,並且條件中的另一個語句可以處理零或0計數。

+0

這個解決方案的問題是a和b都有一個共同的索引。請參閱編輯。非常感謝 – mhz

+0

@mhz - 請參閱修改後的答案 – philosodad

+0

感謝修改後的答案。我最終做了一個大規模的for循環與2個不同的索引工作。但你的方式更有意義!謝謝! – mhz

3

您可以使用枚舉數而不是數字索引遍歷兩個數組。這個例子在a1a2同時迭代,在a2呼應的第一個詞,隨着a1相應的字母開頭,在a2跳過重複:

a1 = ["a", "b", "c", "d"] 
a2 = ["apple", "angst", "banana", "clipper", "crazy", "dizzy"] 

e2 = a2.each 
a1.each do |letter| 
    puts e2.next 
    e2.next while e2.peek.start_with?(letter) rescue nil 
end 

(它假定a1所有字母至少有一個字在a2並且這兩者都是排序的 - 但你明白了。)

0

兩個數組praticatly除了我在跳過幾個要素相同要麼/或在每過一段時間

相反迭代過程中跳過,你可以預先的選擇不可跳過的?

a.select{ ... }.zip(b.select{ ... }).each do |a1,b1| 
    # a1 is an entry from a's subset 
    # b1 is the paired entry bfrom b's subset 
end 
+0

事情是,我不知道我的不可跳過的東西。他們沒有定義 – mhz