lua 删除数组元素的正确姿势
lua中的数组删除元素,如果删除姿势不规范的话,往往会遇到意想不到的问题。那么正确的姿势是怎样的呢?
方法一:
例子:
local list = {"a","b","c","d","e","f","g","h","i",}
print("_______________lastList_________________")
for k,v in pairs(list) do
print(k,v)
end
for k,v in pairs(list) do
if v == "a" or v =="c" then
v =nil
end
end
print("_______________laterList_________________")
for k,v in pairs(list) do
print(k,v)
end
结果:
_______________lastList_________________
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
9 i
_______________laterList_________________
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
9 i
[Finished in 0.1s]
//因为 v 是一个额外的变量,对v的操作无法反馈到数组内部,但是如果v是table,
//table内部存储了引用,对v内部的修改可以反馈过去
方法二:
例子:
local list = {"a","b","c","d","e","f","g","h","i",}
print("_______________lastList_________________")
for k,v in pairs(list) do
print(k,v)
end
for k,v in pairs(list) do
if v == "a" or v =="c" then
list[k] = nil
end
end
结果:
_______________lastList_________________
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
9 i
_______________laterList_________________
2 b
4 d
5 e
6 f
7 g
8 h
9 i
[Finished in 0.1s]
//赋值为nil,可用于多处场景下的删除也可以直接使用key值
方法三:
例子:
//使用table.remove(table,i)。table.remove会使得数组的位移产生,
//从而跳过或者报错。
local list = {"a","c","c","a","e","f","g","h","i",}
print("_______________lastList_________________")
for k,v in pairs(list) do
print(k,v)
end
for k,v in pairs(list) do
if v == "a" or v =="c" then
table.remove(list,k)
end
end
结果:
_______________lastList_________________
1 a
2 c
3 c
4 a
5 e
6 f
7 g
8 h
9 i
_______________laterList_________________
1 c //??????????
2 a //??????????
3 e
4 f
5 g
6 h
7 i
[Finished in 0.1s]
remove的正确使用方法:使用一个新的list保存k值,在新的遍历过程中移除
例子:
local list = {"a","c","c","a","e","f","g","h","i",}
local removeList = {}
print("_______________lastList_________________")
for k,v in pairs(list) do
print(k,v)
end
for k,v in pairs(list) do
if (v == "a") or (v == "c") then
table.insert(removeList,k)
end
end
print("_______________removeList_________________")
for k,v in pairs(removeList) do
print(k,v)
end
for _,v in pairs(removeList) do
table.remove(list,v)
end
print("_______________laterList_________________")
for k,v in pairs(list) do
print(k,v)
end
结果:
_______________lastList_________________
1 a
2 c
3 c
4 a
5 e
6 f
7 g
8 h
9 i
_______________removeList_________________
1 1
2 2
3 3
4 4
_______________laterList_________________
1 c
2 a
3 f
4 h
5 i
[Finished in 0.1s]
怎么说呢,table.remove使用起来很麻烦,而且使用有局限性(对于不是用顺序表存储的table无法使用),所以推荐使用nil赋值进行清除,但是这样做,并没有真正的删除这个值,只是循环时不会显示出来,实际上table的长度并没有变化。