您的位置:首页 > 编程语言 > Lua

Lua、table表的遍历过程中删除remove元素会出现的问题及解决

2014-03-19 11:50 639 查看
在table表中使用for迭代时,将符合条件的元素删除时,后面元素前移,然后产生跳跃
而且使用for i=1,#mytable 这样的循环时,由于在for时就已经确定了循环的终点是table的总长度,
在整个for运行过程中,终点不会改变。
所以当你删除元素时,在循环到i = #mytable 时,会报错nil。因为此时table长度已经缩短了。
那么该怎么遍历table时删除符合条件的元素呢。
网上查了一下,使用while可以。写了一个小测试例子:

local t = {}
t[1] = 1
t[2] = 2
t[3] = 3
t[4] = 4
t[5] = 5
t[6] = 6
local i = 1
while i < #t do
print(i)
print(t[i].."\n------------------")
if t[i] == 3 then
print("删除操作、值:"..t[i])
print("\n------------------")
table.remove(t,i)
else
i = i + 1
end
end




达到预期效果、可行。

----------------------------------------------

第二种方式是新建一个表来存储原表中需要保留下来的元素,否则不保存
这样也可以达到删除原表中特定元素的效果,不过消耗了一定的内存,代码如下:

local t = {}
local t_clone = {}
t[1] = 1
t[2] = 2
t[3] = 3
t[4] = 4
t[5] = 5
t[6] = 6
local i = 1
local j = 1
for i,v in pairs(t) do
print(i)
print(t[i].."\n------------------")
if t[i] == 3 then
print("删除操作、值:"..t[i])
print("\n------------------")
else
t_clone[j] =t[i]
j = j + 1
end
i = i + 1
end
--释放t表
t = nil

for i=1,#t_clone do
print(i.."  =  "..t_clone[i])
end


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: