迭代数组并在继续迭代的同时从中间删除随机项的一般情况
如果您从前到后迭代,当您删除元素 N 时,迭代中的下一个元素 (N+1) 将向下移动到该位置。如果您增加迭代变量(如 ipairs 所做的那样),您将跳过该元素。我们有两种方法可以解决这个问题。
使用此示例数据:
input = { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p' }
remove = { f=true, g=true, j=true, n=true, o=true, p=true }
我们可以删除input
迭代期间的元素:
-
从后向前迭代。
for i=#input,1,-1 do
if remove[input[i]] then
table.remove(input, i)
end
end
-
手动控制循环变量,这样我们就可以在删除元素时跳过递增它:
local i=1
while i <= #input do
if remove[input[i]] then
table.remove(input, i)
else
i = i + 1
end
end
对于非数组表,您可以使用迭代next
or pairs
(其实施方式是next
) 并将您想要删除的项目设置为nil
.
注意table.remove
每次调用时都会移动所有后续元素,因此 N 次删除的性能呈指数级增长。如果您要删除很多元素,您应该像 LHF 或 Mitch 的答案一样自行移动这些项目。