天天看点

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的长度并没有变化。

继续阅读