1

我有这段代码,但我不知道为什么它没有给我正确的答案

list = [1] 
a = [0,0,2,3,4]

for n in a
  if n!= 0
    list.push(n)
    a.delete(n)
  end
end 

p list => [1,2,4]
p a => [0,0,3]

我不明白为什么没有将数字添加到列表中。当我尝试只使用“push”而不是“a.delete”时,我得到了正确的答案

list = [1,2,3,4]
a = [0,0,2,3,4]

到底是怎么回事?

4

2 回答 2

4

迭代集合的第一条规则:不要更改您当前正在迭代的集合!.

一个快速的解决方法是迭代集合的副本

list = [1] 
a = [0,0,2,3,4]

for n in a.dup # here, a copy
  if n!= 0
    list.push(n)
    a.delete(n)
  end
end 

list # => [1, 2, 3, 4]
a # => [0, 0]
于 2013-05-29T21:10:38.667 回答
2

仔细查看输出:

list = [1] 
a = [0,0,2,3,4]

for n in a
  if n!= 0
    list.push(n)
    a.delete(n)
    p list,a
  end
end 

输出:

[1, 2]
[0, 0, 3, 4]
[1, 2, 4]
[0, 0, 3]

因此,当您的循环 deleted 2(删除前位于第 3 项)时,3 进入该位置。当循环完成第 3 项处理时,它将跳转到从集合中获取下一项,即 4。这就是第 3 项将被跳过的方式。删除后,您的所有项目都会从右向左移动。请看下面的内容,以更清楚地了解循环内部发生的情况以及a每次删除后的收集状态。

list = [1] 
a = [0,0,2,3,4]

for n in a
  if n!= 0
    p n
    i = a.find_index(n)
    list.push(n)
    a.delete(n)
    p a[i]
    p "-" *8
  end
end 

输出:

2
3
"--------"
4
nil
"--------"
于 2013-05-29T21:10:56.647 回答