Lua、table表的遍歷過程中刪除remove元素會出現的問題及解決


在table表中使用for迭代時,將符合條件的元素刪除時,后面元素前移,然后產生跳躍
而且使用for i=1,#mytable 這樣的循環時,由於在for時就已經確定了循環的終點是table的總長度,
在整個for運行過程中,終點不會改變。
所以當你刪除元素時,在循環到i = #mytable 時,會報錯nil。因為此時table長度已經縮短了。
那么該怎么遍歷table時刪除符合條件的元素呢。
網上查了一下,使用while可以。寫了一個小測試例子:

 1     local t = {}
 2     t[1] = 1
 3     t[2] = 2
 4     t[3] = 3
 5     t[4] = 4
 6     t[5] = 5
 7     t[6] = 6
 8     local i = 1
 9     while i < #t do
10         print(i)
11         print(t[i].."\n------------------")
12         if t[i] == 3 then
13             print("刪除操作、值:"..t[i])
14             print("\n------------------")
15             table.remove(t,i)
16         else
17             i = i + 1
18         end
19     end

達到預期效果、可行。

----------------------------------------------

 第二種方式是新建一個表來存儲原表中需要保留下來的元素,否則不保存
這樣也可以達到刪除原表中特定元素的效果,不過消耗了一定的內存,代碼如下:

 1 local t = {}
 2     local t_clone = {}
 3     t[1] = 1
 4     t[2] = 2
 5     t[3] = 3
 6     t[4] = 4
 7     t[5] = 5
 8     t[6] = 6
 9     local i = 1
10     local j = 1
11     for i,v in pairs(t) do
12         print(i)
13         print(t[i].."\n------------------")
14         if t[i] == 3 then
15             print("刪除操作、值:"..t[i])
16             print("\n------------------")
17         else
18             t_clone[j] =t[i]
19             j = j + 1
20         end
21         i = i + 1
22     end
23     --釋放t表
24     t = nil
25 
26     for i=1,#t_clone do
27         print(i.."  =  "..t_clone[i])
28     end

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM