lua table 遍歷和刪除

table 的遍歷和刪除

遍歷

常見的4種形式

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

  • for k,v in pairs(tbtest) do 這種形式的遍歷
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

  • for k,v in ipairs(tbtest) do 這種形式
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

  • table.maxn這種形式,獲取的只針對整數的key,字符串的key是沒辦法獲取到的.
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種方式.

  • 從後往前刪.
    先構造一個要被刪除的數據作key的表
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操做後,後面的元素會往前移位,這時候後續的刪除索引對應的元素已經不是以前的索引對應的元素了

  • while刪除
local i = 1
while i <= #test do
    if remove[test[i]] then
        table.remove(test,i)
    else
        i = i + 1
    end
end
  • 其實和while刪除比較相似
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

將方法裏面的條件修改一下便可知足要求.

相關文章
相關標籤/搜索