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 

前两种是泛型遍历,后两种是数值型遍历。

  • 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

将方法里面的条件修改一下即可满足要求.

转载于:https://www.cnblogs.com/daihanlong/p/7106670.html

评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符 “速评一下”
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页