這篇文章主要介紹了Lua table中安全移除元素的方法,本文給出3種實現(xiàn)方法,分別是從后往前刪除和while刪除,需要的朋友可以參考下
在Lua中,table如何安全的移除元素這點挺重要,因為如果不小心,會沒有正確的移除,造成內(nèi)存泄漏,
Lua table中安全移除元素的方法
。引子
比如有些朋友常常這么做,大家看有啥問題
將test表中的偶數(shù)移除掉
代碼如下:
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(chǎn)‘,‘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
說明:一般我們不在循環(huán)中刪除,在循環(huán)中刪除會造成一些錯誤,
電腦資料
《Lua table中安全移除元素的方法》(http://www.msguai.com)。這是可以建立一個remove表用來標記將要刪除的,如上面例子,把將要刪除的標記為true方法1 從后往前刪除
代碼如下:
for i = #test, 1, -1 do
if remove[test[i]] then
table.remove(test, i)
end
end
dump(test)
為什么不從前往后,朋友們可以測試,table.remove操作后,后面的元素會往前移位,這時候后續(xù)的刪除索引對應的元素已經(jīng)不是之前的索引對應的元素了。
方法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)