Lua table中安全移除元素的方法

2023-12-05 0 691

Lua中,table如何安全的移除元素这点挺重要,因为如果不小心,会没有正确的移除,造成内存泄漏。

引子

比如有些朋友常常这么做,大家看有啥问题

将test表中的偶数移除掉
复制代码 代码如下:
local test = { 2, 3, 4, 8, 9, 100, 20, 13, 15, 7, 11}
for i, v in ipairs( test ) do
if v % 2 == 0 then
table.remove(test, i)
end
end

for i, v in ipairs( test ) do
print(i .. \”====\” .. v)
end

打印结果:
复制代码 代码如下:
1====3
2====8
3====9
4====20
5====13
6====15
7====7
8====11
[Finished in 0.0s]

有问题吧,20怎么还在?这就是在遍历中删除导致的。

如何做呢?

Let\’s get started!

复制代码 代码如下:
local test = { \’a\’,\’b\’,\’c\’,\’d\’,\’e\’,\’f\’,\’g\’,\’h\’,\’i\’,\’j\’,\’k\’,\’l\’,\’m\’,\’n\’,\’o\’,\’p\’ }
local remove = { a = true, b = true, c = true, e = true, f = true, p = true }

local function dump(table)
for k, v in pairs( table ) do
print(k)
print(v)
print(\”*********\”)
end
end

说明:一般我们不在循环中删除,在循环中删除会造成一些错误。这是可以建立一个remove表用来标记将要删除的,如上面例子,把将要删除的标记为true

方法1 从后往前删除
复制代码 代码如下:
for i = #test, 1, -1 do
if remove[test[i]] then
table.remove(test, i)
end
end

dump(test)

为什么不从前往后,朋友们可以测试,table.remove操作后,后面的元素会往前移位,这时候后续的删除索引对应的元素已经不是之前的索引对应的元素了。

方法2 while删除
复制代码 代码如下:
local i = 1
while i <= #test do
if remove[test[i]] then
table.remove(test, i)
else
i = i + 1
end
end

方法3 quick中提供的removeItem
复制代码 代码如下:
function table.removeItem(list, item, removeAll)
local rmCount = 0
for i = 1, #list do
if list[i – rmCount] == item then
table.remove(list, i – rmCount)
if removeAll then
rmCount = rmCount + 1
else
break
end
end
end
end

for k, v in pairs( remove ) do
table.removeItem(test, k)
end

dump(test)

您可能感兴趣的文章:

  • 深入谈谈lua中神奇的table
  • Lua Table转C# Dictionary的方法示例
  • Lua中设置table为只读属性的方法详解
  • Lua编程示例(一):select、debug、可变参数、table操作、error
  • 举例讲解Lua中的Table数据结构
  • Lua的table库函数insert、remove、concat、sort详细介绍
  • C++遍历Lua table的方法实例
  • Lua中释放table占用内存的方法
  • Lua中table的遍历详解
  • Lua中获取table长度问题探讨
  • Lua中获取table长度的方法
  • Lua中table里内嵌table的例子
  • Lua面向对象编程之基础结构table简例

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悠久资源 Lua Lua table中安全移除元素的方法 https://www.u-9.cn/jiaoben/lua/101599.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务