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
前兩種是泛型遍歷,后兩種是數值型遍歷。
- 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值排列的順序來遍歷的。
- 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不連續為止
- 這種遍歷里面的'#',作用是取長度
tbtest = {
[1] = 1,
[2] = 2,
[3] = 3,
}
print(#(tbtest))
這樣的結果是3,如果
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.
- 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,如果
tbtest = {
["a"] = 1,
[2] = 2,
[3] = 3,
}
print(table.maxn(tbtest))
那么打印的就是3了,如果
tbtest = {
["a"] = 1,
["b"] = 2,
["c"] = 3,
}
print(table.maxn(tbtest))
print(#(tbtest))
打印結果就是0了.
刪除
例如刪除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
將方法里面的條件修改一下即可滿足要求.
