2013-08-31 41 views
0

我不明白爲什麼,但是當嵌套這兩個循環時生成的插入和匹配太多。任何幫助感謝!嵌套for循環中的數組插入和過度匹配 - ruby​​

僞 兩個數組 - 嵌套用於在第一陣列 每個元件的匹配迴路 搜索第二陣列如果在第二陣列中的匹配,取數在第一陣列的匹配 插入件數後具有字之後被匹配 結束

問題代碼:

ary1 = ['a','b','c','d'] 
ary2 = ['e','f','g', 'a'] 


limit = ary1.count - 1 
limit2 = ary2.count - 1 

(0..limit).each do |i| 
    (0..limit2).each do |j| 
    if ary1[i] == ary2[j] 
     ary1.insert(i,ary2[j]) 
     puts 'match!' 
    end 
    end 
end 

puts ary1 

輸出: 比賽! 匹配! 匹配! 匹配! 一個 一個 一個 一個 一個 b Ç d

臨時溶液:

ary1 = ['a','b','c','d'] 
ary2 = ['e','f','g', 'a'] 
# have to make a copy to avoid excessive matches 
ary_dup = Array.new(ary1) 

limit = ary1.count - 1 
limit2 = ary2.count - 1 

(0..limit).each do |i| 
    (0..limit2).each do |j| 
    if ary1[i] == ary2[j] 
     ary_dup.insert(i,ary2[j]) 
     puts 'match!' 
    end 
    end 
end 

puts ary_dup 

輸出: 匹配! 一個 一個 b Ç d

回答

1

它的發生是因爲你正在修改正在檢查的數組(ary1)。

你可以使用這行代碼實現所需的結果 -

(ary1 & ary2).each {|e| ary1.insert(ary1.index(e)+1,e)} 

它的作用是 -

  1. ary1 & ary2返回一個數組這是兩個陣列的交叉點 - ary1和ary2。換句話說,它將包含兩個數組中存在的所有元素。

  2. .each和隨後的塊遍歷移到該新的數組,並在"index of original element" + 1

puts ary1 #=> ["a", "a", "b", "c", "d"]

+1

@Chris:nonocut的解決方案反映了Ruby解決問題的方式。 Ruby通常提供很多選擇;另一個將是a.map {| e | b。包括?(e)? [e,e]:e} .flatten(假設我正確理解問題)。 –

0

的下面部分是不correcrt:

(0..limit).each do |i| 
    (0..limit2).each do |j| 
    if ary1[i] == ary2[j] 
     ary1.insert(i,ary2[j]) 
     puts 'match!' 
    end 
    end 
end 

第一遍:

ary1 = ['a','b','c','d'] 
ary2 = ['e','f','g', 'a'] 

limit=0limit2 = 3,存在匹配。 ary1.insert(0,ary2[j])線讓你的陣列ary1ary1 = ['a','a','b','c','d']

第二遍:

ary1 = ['a','a',b','c','d'] 
ary2 = ['e','f','g', 'a'] 

limit=1limit2 = 3,有一個匹配。 ary1.insert(1,ary2[j])行使您的陣列ary1ary1 = ['a','a','a','b','c','d']

而且持續了..所以作爲你的arr1是有大小,4 a s已被添加到ary1。最後它變成 - [ a,a,a,a,a,b,c,d]

Array#insert表示: -

插入具有給定index.Negative指數的元素之前的給定的值向後從陣列,其中-1表示最後一個元件的端部計數。

+0

你忘了添加第二個「a」到下ary1插入在ary1每個元素「第二通:」 。 –

+0

@CarySwoveland是的,現在完成了...感謝您的評論.. –