加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

lua中table如何安全移除元素

发布时间:2020-12-14 22:00:14 所属栏目:大数据 来源:网络整理
导读:MAY 20,2014?|?4 COMMENTS 在Lua中,table如何安全的移除元素这点挺重要,因为如果不小心,会没有正确的移除,造成内存泄漏。 引子 比如有些朋友常常这么做,大家看有啥问题 将test表中的偶数移除掉 local test = { 2 , 3 ,152)">4 ,152)">8 ,152)">9 ,152)"
  • MAY 20,2014?|?4 COMMENTS

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

    引子

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

    将test表中的偶数移除掉
    local test = { 2, 3,152)">4,152)">8,152)">9,152)">100,152)">20,152)">13,152)">15,152)">7,152)">11}
    for i, v in ipairs( test ) do
        if v % 2 == 0 then
            table.remove(test, i)
        end
    end
    
    do
        print(i .. "====" .. v)
    end
    

    打印结果:

    1====3
    28
    39
    420
    513
    615
    77
    811
    [Finished in 0.0s]
    

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

    如何做呢?

    Let's get started!
    = { 'a','b',152)">'c',152)">'d',152)">'e',152)">'f',152)">'g',152)">'h',152)">'i',152)">'j',152)">'k',152)">'l',152)">'m',152)">'n',152)">'o',152)">'p' } local remove = { a = true, b c e f p true } local function dump(table) for k,0)">pairs( table ) do print(k) print(v) print("*********") end

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

    方法1 从后往前删除

    for i = #test,152)">1, -1 if remove[test[i]] end
    
    dump(test)
    

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

    方法2 while删除

    local i = 1 while i <= #test else i = i + 1 end dump(test)

    方法3 quick中提供的removeItem

    function table.removeItem(list, item, removeAll) local rmCount 0 #list do if list[i - rmCount] == item then table.remove(list, i - rmCount) if removeAll then rmCount = rmCount 1 else break end end pairs( remove ) do table.removeItem(test, k) end dump(test)

    github地址

    • https://github.com/dabing1022/LuaAndLove2dLearningTest/blob/master/LuaTest09/test12.lua

    • https://github.com/dabing1022/LuaAndLove2dLearningTest/blob/master/LuaTest09/test13.lua


    原文地址: http://childhood.logdown.com/posts/200499/lua-table-how-to-safely-remove-an-element

MAY 20,2014?|?4 COMMENTS

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读