在表中删除所有指定数值的记录

我想从一个表中删除全部与给定值相等的条目。 现在,我遇到了一个相当麻烦的问题,可能需要知道如何处理。

这是代码:

function(list_to_search_in, compared_value, invert)
    for k,v in pairs(list_to_search_in) do
        if invert and v ~= compared_value then
            table.remove(list_to_search_in, v)
        if not invert and v == compared_value then
            table.remove(list_to_search_in, v)
         end
    end
end

问题:

假设表是 { 1, 2, 3, 2 }。当我遍历这个循环并来到第一个匹配时,它将从表中删除。这意味着值和键被删除。

现在,删除的值的键被分配给下一个值。但是由于脚本将检查下一个键的值,这个值(其键刚刚更改)将永远不会被检查。

我认为,一个简单的

k = k - 1

在删除后会做好工作,但它并没有。

v = nil

会很好,但只有当垃圾回收器在pairs迭代到下一个值的这一刻不做它的工作时。

有人有想法吗?我宁愿使用基于文本的提示来解决问题,而不是使用解决问题的完成语法。

点赞
用户258523
用户258523

不要使用table.remove。它会从类似数组的表中挤出“空洞”,这在使用pairs/ next进行迭代时是不允许的。只需将该值设为nil即可。

如果您需要挤出表中的空洞,则可以创建一个新的表,并仅填充要保留的值,或者在第一次传递中进行删除,然后在第二次传递中挤压出空洞。

此外,使用pairs时的项遍历顺序无法得到保证。

2014-09-09 11:23:52