在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.."\n------------------")
12 if t == 3 then
13 print("删除操作、值:"..t)
14 print("\n------------------")
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.."\n------------------")
14 if t == 3 then
15 print("删除操作、值:"..t)
16 print("\n------------------")
17 else
18 t_clone[j] =t
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)
28 end
|