天天看點

lua 删除數組元素的正确姿勢

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

繼續閱讀