0

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

伪代码两个数组-嵌套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

输出:匹配!匹配!匹配!匹配!a a a a 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

输出:匹配!a a b c d

4

2 回答 2

1

发生这种情况是因为您正在即时修改正在检查的数组 (ary1)。

您可以使用这行代码达到预期的结果 -

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

它的作用是——

  1. ary1 & ary2返回一个数组,它是两个数组 - ary1 和 ary2 的交集。换句话说,它将包含两个数组中存在的所有元素。

  2. .each并且随后的块遍历这个新数组并将每个元素插入到 ary1"index of original element" + 1

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

于 2013-08-31T20:47:08.383 回答
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时, 4 as 已添加到ary1. 最后变成 - [ a,a,a,a,a,b,c,d]

Array#insert说:-

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

于 2013-08-31T20:21:07.560 回答