在table表中使用for迭代时,将符合条件的元素删除时,后面元素前移,然后产生跳跃
而且使用for i=1,#mytable 这样的循环时,由于在for时就已经确定了循环的终点是table的总长度,
在整个for运行过程中,终点不会改变。
所以当你删除元素时,在循环到i = #mytable 时,会报错nil。因为此时table长度已经缩短了。
那么该怎么遍历table时删除符合条件的元素呢。
网上查了一下,使用while可以。写了一个小测试例子:
1 local t = {} 2 t[1] = 1 3 t[2] = 2 4 t[3] = 3 5 t[4] = 4 6 t[5] = 5 7 t[6] = 6 8 local i = 1 9 while i < #t do 10 print(i) 11 print(t[i].." ------------------") 12 if t[i] == 3 then 13 print("删除操作、值:"..t[i]) 14 print(" ------------------") 15 table.remove(t,i) 16 else 17 i = i + 1 18 end 19 end
达到预期效果、可行。
----------------------------------------------
第二种方式是新建一个表来存储原表中需要保留下来的元素,否则不保存
这样也可以达到删除原表中特定元素的效果,不过消耗了一定的内存,代码如下:
1 local t = {} 2 local t_clone = {} 3 t[1] = 1 4 t[2] = 2 5 t[3] = 3 6 t[4] = 4 7 t[5] = 5 8 t[6] = 6 9 local i = 1 10 local j = 1 11 for i,v in pairs(t) do 12 print(i) 13 print(t[i].." ------------------") 14 if t[i] == 3 then 15 print("删除操作、值:"..t[i]) 16 print(" ------------------") 17 else 18 t_clone[j] =t[i] 19 j = j + 1 20 end 21 i = i + 1 22 end 23 --释放t表 24 t = nil 25 26 for i=1,#t_clone do 27 print(i.." = "..t_clone[i]) 28 end