for key, value in pairs(tbtest) do XXX end for key, value in ipairs(tbtest) do XXX end for i=1, #(tbtest) do XXX end for i=1, table.maxn(tbtest) do XXX end
前兩種是泛型遍歷,後兩種是數值型遍歷。lua
tbtest = { [1] = 1, [2] = 2, [3] = 3, [4] = 4, } for key, value in pairs(tbtest) do print(value) end
從遍歷結果上看,結果並非按照table中key的順序打印,而是根據tbtest中key的hash值排列的順序來遍歷的。code
tbtest = { [1] = 1, [2] = 2, [3] = 3, [5] = 5, } for k,v in ipairs(tbtest) do print(v) end
只會打印1,2,3。而5則不會顯示。若是按照這樣索引
local tbtest = { [2] = 2, [3] = 3, [5] = 5, } for k,v in ipairs(tbtest) do print(v) end
則一個也不會打印出來
for k,v in ipairs(tbtest) do 這樣的循環必需要求tbtest中的key爲順序的,並且必須是從1開始,ipairs只會從1開始按連續的key順序遍歷到key不連續爲止ip
tbtest = { [1] = 1, [2] = 2, [3] = 3, } print(#(tbtest))
這樣的結果是3,若是rem
tbtest = { [1] = 1, [2] = 2, [6] = 6, } print(#(tbtest))
則結果是2,若是字符串
tbtest = { ["a"] = 1, [2] = 2, [3] = 3, } print(#(tbtest))
則打印的就是0,由於'#'沒有找到key爲1的值
因此,for i=1, #(tbtest) do這種遍歷,只能遍歷當tbtest中存在key爲1的value時纔會出現結果,並且是按照key從1開始依次遞增1的順序來遍歷,找到一個遞增不是1的時候就結束再也不遍歷,不管後面是否仍然是順序的key.hash
tbtest = { [1] = 1, [2] = 2, [3] = 3, } print(table.maxn(tbtest)) tbtest = { [6] = 6, [1] = 1, [2] = 2, } print(table.maxn(tbtest))
打印的結果是3和6,若是it
tbtest = { ["a"] = 1, [2] = 2, [3] = 3, } print(table.maxn(tbtest))
那麼打印的就是3了,若是io
tbtest = { ["a"] = 1, ["b"] = 2, ["c"] = 3, } print(table.maxn(tbtest)) print(#(tbtest))
打印結果就是0了.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
打印出的結果裏面還包含20,這樣的刪除由於改變了表的大小致使的.
通常有3種方式.
local remove = { [2] = true, [4] = true, [8] = true, [100] = true, [20] = true } for i = #test , 1 , -1 do if remove[test[i]] then table.remove(test,i) end end
爲何不從前日後?由於table.remove操做後,後面的元素會往前移位,這時候後續的刪除索引對應的元素已經不是以前的索引對應的元素了
local i = 1 while i <= #test do if remove[test[i]] then table.remove(test,i) else i = i + 1 end end
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
將方法裏面的條件修改一下便可知足要求.