Lua删除table中数据必须知道的小技巧

一直专注于战斗逻辑的可玩性,所以一直与table保持了联系.所以我必须对它有一个非常清晰的认识
做数据删除后,很多时候程序运行的结果跟我们想要的结果是不一样的.
我决定重视这个小但十分重要的问题。
以下是我的解决方案


这里的重点是要求该数组删除数据后依然保持key的连续性且始终是从1开始的

*这样也可以保证 ipairs()的正确性 等等
*-- 第一种删除数据方法
这种方法无疑是最好的,先用一个临时表记录要删除的所有key,然后再延迟统一删除.

local a = {11,12,13,13,15,13,13,17,18}
local b = {}
for k,v in pairs(a) do
if v == 13 then
table.insert(b, k)
end
end

table.sort(b,function( d,e)
return d>e
end)

for k,v in pairs(b) do
table.remove(a, v)
end
b = nil

print(unpack(a))

这里的重点是该数组key可以随意指定且可不具备连续性的要求的前提下
– 第二种删除数据方法
local c = {a=11, b=12, c=13, d=13, e=15, f=13,g=13, h=17, j=18}
for k,v in pairs© do
if v == 13 then
c = nil
end
end

对于没有重复数据的,直接table.remove(table,k)就好了。。。
不过LZ的方法应该用得上。

做数据删除后,很多时候程序运行的结果跟我们想要的结果是不一样的.

这个能说的详细些吗? 没怎么看明白

直接 table.remove的话会带来很多问题 具体请看这个 ChildhoodAndy在开源中国写的一篇文章
http://childhood.logdown.com/posts/200499/lua-table-how-to-safely-remove-an-element

我发现你这个没有从后往前删啊。还是会删错的吧?

最初没认真看自己发布的代码, 为了表示感谢 so 我现在把没有问题的做法更新了 请检阅

你这种做法应该是有问题的. 在遍历中用remove从前往后肯定有问题:12:

亲 我测过很多次 正是因为有问题我才提出来这种做法的

肯定有问题, 你再测一下.
要么就是你一楼的代码写错了. 你再检查一下

肯定有问题 你指什么有问题 可以明确的指出来么 记得顺便附上你测试的例子代码块 我确实没发现问题 :6:

for k,v in pairs(b) do
table.remove(a, k)
end

在这里 b.k中保存的是a表中要删除的元素的索引.
删第一个值的时候是没有问题的. 但是由于remove会把被删除元素后面的元素往前移一位. 所以这时b表中保存索引已经没有意义了

b的内容是{3 = 1,4 = 1,6 = 1,7 = 1}
所以上面用来删除的那个for循环等价于:
table.remove(a, 3)
table.remove(a, 4)
table.remove(a, 6)
table.remove(a, 7)
这样删,你说有没有问题?

测试代码就是你贴出来的那个
运行结果:
11 12 13 13 17 18

万分感谢你的反馈 问题已经修正了 实际代码跟我yy的代码是不一样的 盲目自信导致我也没有认真去看 这是病得治啊 请见谅

这说明实际上 a = nil。是最好的删除方式!

第一种方法现在应该没有问题了吧 :10: 我特意在这个电脑上装了下coderRunner测了啊

到底有没有问题啊,你怎么又说没有问题了…什么情况:876:

嗯,我看到一楼修改后的代码了. 没有问题. 达到的效果就是从后往前删

嗯嗯 有好的想法 记得反馈哦

很棒的代码:)
没有BUG,完美删除table表中指定的元素。
不过大部分情况下,我们在删除table表中元素时,是保证K-V不要变动的。

kv不变的话 相对好处理点 直接第二种方法咯