一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Lua - Lua table中安全移除元素的方法

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

2020-05-04 12:44腳本之家 Lua

這篇文章主要介紹了Lua table中安全移除元素的方法,本文給出3種實現方法,分別是從后往前刪除和while刪除,需要的朋友可以參考下

在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)

 

延伸 · 閱讀

精彩推薦
  • LuaLua中計算、執行字符串中Lua代碼的方法

    Lua中計算、執行字符串中Lua代碼的方法

    這篇文章主要介紹了Lua中計算、執行字符串中Lua代碼的方法,類似JavaScript中eval函數的功能,在Lua中也可以實現,需要的朋友可以參考下 ...

    腳本之家6322020-04-30
  • LuaLua和C語言的交互詳解

    Lua和C語言的交互詳解

    這篇文章主要介紹了Lua和C語言的交互詳解,Lua和C語言通過棧完成交互,本文結合代碼實例詳細講解了交互的方法,需要的朋友可以參考下 ...

    果凍想3702020-04-14
  • LuaLua中的元方法__newindex詳解

    Lua中的元方法__newindex詳解

    這篇文章主要介紹了Lua中的元方法__newindex詳解,本文講解了查詢與更新、監控賦值、通過table給另一個table賦值等內容,需要的朋友可以參考下 ...

    笨木頭8872020-04-09
  • LuaLua中table庫函數方法介紹

    Lua中table庫函數方法介紹

    這篇文章主要介紹了Lua中table庫函數方法介紹,本文講解了concat、insert、maxn、remove、sort、foreachi等方法,需要的朋友可以參考下 ...

    腳本之家2502020-04-17
  • LuaLua簡介、編譯安裝教程及變量等語法介紹

    Lua簡介、編譯安裝教程及變量等語法介紹

    這篇文章主要介紹了Lua簡介、編譯安裝教程及變量等語法介紹,本文同時講解了lua注釋語法、Lua命令行方式等內容,需要的朋友可以參考下 ...

    junjie3632020-04-14
  • LuaLua教程(二):基礎知識、類型與值介紹

    Lua教程(二):基礎知識、類型與值介紹

    這篇文章主要介紹了Lua教程(二):基礎知識、類型與值介紹,本文講解了Hello World程序、代碼規范、全局變量、類型與值等內容,需要的朋友可以參考下 ...

    腳本之家5922020-04-28
  • LuaLua實現__add方法重載示例

    Lua實現__add方法重載示例

    這篇文章主要介紹了Lua實現__add方法重載示例,本文直接給出實現代碼,需要的朋友可以參考下 ...

    腳本之家7452020-04-24
  • Lua深入探究Lua中的解析表達式

    深入探究Lua中的解析表達式

    這篇文章主要介紹了深入探究Lua中的解析表達式,對于其語法部分的說明和示例都超詳細,極力推薦此文!需要的朋友可以參考下 ...

    腳本之家3542020-05-05
主站蜘蛛池模板: 日本中文字幕一区二区有码在线 | 狠狠色婷婷 | 国产一区二区免费福利片 | 免费网站国产 | 国产清纯白嫩大学生正在播放 | 国产欧美一区二区精品性色99 | 波多野结衣中文丝袜字幕 | 欧洲vodafone精品性 | 欧美整片完整片视频在线 | 亚洲 另类 欧美 变态屎尿 | 插得爽| 日本人护士免费xxxx视频 | 久久99国产亚洲高清观着 | 韩国三级hd中文字幕李采潭 | bt天堂午夜国产精品 | 美女1819xxxx| 青青青国产精品国产精品美女 | 双性肉文h| 青柠在线完整高清观看免费 | 美女毛片老太婆bbb80岁 | 久久亚洲电影www电影网 | 欧美日韩一区二区三区免费不卡 | 无遮挡免费h肉动漫在线观看 | 日本在线一区二区 | 亚洲冬月枫中文字幕在线看 | 成人四虎 | 歪歪私人影院成人毛片 | 臀控福利大臀的网站 | 国产亚洲精品第一综合另类 | 91国内在线国内在线播放 | 无人区在线观看免费完整版免费 | 欧美日韩精品亚洲精品v18 | 高清视频在线播放ww | 深夜福利免费在线观看 | 国产成人综合精品 | 99re热 | 国语自产拍在线观看7m | 国产第7页 | 国产成人手机在线好好热 | 黄动漫车车好快的车车a | 99久久综合久中文字幕 |