数组插入和嵌套for循环中的过多匹配 - ruby

时间:2013-08-31 20:12:35

标签: ruby nested-loops

我不明白为什么,但是当我嵌套这两个循环时,我得到了太多的插入和匹配。任何帮助表示赞赏!

伪代码 两个数组 - 嵌套for循环 搜索第二个数组以匹配第一个数组中的每个元素 如果第二个数组中有匹配,请在匹配后取数字 在匹配的单词之后在第一个数组中插入数字 端

问题代码:

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 C 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 C d

2 个答案:

答案 0 :(得分: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

  3. 的ary1中插入每个元素

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

答案 1 :(得分:0)

以下部分不相符:

(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已添加到ary1。最后它变成了 - [ a,a,a,a,a,b,c,d]

Array#insert说: -

  

在具有给定索引的元素之前插入给定值。负数索引从数组末尾向后计数,其中-1是最后一个元素。