lua遍历table中删除table中元素

很多时候,我们有这样的需求:删除table中若干符合条件的元素,最原始的想法就是用for遍历一边table,符合条件的用table.remove就可以了

function test1(t)
 for i , v in ipairs(t) do
   if v.id%3 == 0 then
     table.remove(t ,i)
   end
 end
end

​

结果证明这是不行的,因为table.remove删除第i元素后,i后面的元素会向前补齐,这样删除前处于i+1的元素就变成了i元素,然后for循环从t中取第i+1个元素,这样就漏掉了第i+1个元素,既然这样不行,很自然的就想到用while循环,可以自由控制“遍历的指针”是否前进,有删除操作,就不前进,否则才前进

代码如下
 


function test2(t)
	local int i =1
	while(t[i]) do
		if t[i].id%3 == 0 then
			table.remove(t , i)
		else
			i = i + 1
		end
	end
end

跑一下,很正常!

但是注意table.remove是删除队列中的一个元素,每一次操作都要移动大量元素,性能不会太好,因此可以考虑用临时的table,用来保存没有被删除的元素,最后再让t指向这个table,以空间来换时间,而实际使用中,t中的元素往往是table类型,这样临时的table中只会保存元素的引用,因此占用的空间几乎可以忽略不计。

代码如下
 

function test3(t)
	local newT = {}
	for i ,v in ipairs(t) do
		if v.id%3 ~= 0 then
			table.insert(newT , v)
		end
	end
	t= newT
end

很好奇test3()到底比test2()快多少呢,我测试了一下

t = {}
local n = 10000
for i = 1,n do
table.insert(t ,{id = i})

n是10000的情况下:

test2耗时0.234s

test3耗时0.002s

相差非常大。

 

结论:

删除table中的多个元素,在table较大,且删除操作较频繁时,切忌使用table.remove

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值