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的長度并沒有變化。