Lua中遍历table主要有四种方式,各有各的不同
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
1. for key,value in pairs(tbtest)
Lua的存储并不是顺序存储的,所以当我们使用第一种遍历方法去遍历的时候,输出的值可能和我们想象的顺序不同。
tbtest = {
[1] = 1,
[2] = 2,
[3] = 3,
[4] = 4,
}
for k,v in pairs(tbtest) do
print(v)
end
在我们的设想里,我们是希望它输出1,2,3,4,但是实际上输出的是1,2,4,3。for k,v in ipairs(tbtest) do是根据key中的hash值的排列顺序来排列的。
2. for key,value in ipairs(tbtest)
它的前提是key是从1开始的,那么它会按照key的大小顺序进行遍历,如果key不连续,它就不会接下去遍历
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
这样就一个都不会遍历
3. for i=1,#(tbtest) do
因为#table 是获取table里的数组段的长度,遍历时只会输出数组段的值,并且它的前提也是key必须从1开始,如果key不从1开始,#tbtest获取到的值就是0
tbtest = {
[1] = 1,
[2] = 2,
[6] = 6,
}
print(#(tbtest)) //输出2
tbtest = {
["a"] = 1,
[2] = 2,
[3] = 3,
}
print(#(tbtest)) //输出0
4. for I=1 ,table.maxn(tbtest) do
它获取的是数组段的key的最大值,字符串的key是无法获取到的
tbtest = {
[1] = 1,
[2] = 2,
[3] = 3,
}
print(table.maxn(tbtest)) //输出3
tbtest = {
[6] = 6,
[1] = 1,
[2] = 2,
}
print(table.maxn(tbtest)) //输出6
tbtest = {
["a"] = 1,
[2] = 2,
[3] = 3,
}
print(table.maxn(tbtest)) //输出3
其实maxn还是很有用处的,用它取到最大的key值,我们就可以从前往后遍历数据了,完全可以略过nil
5. while/repeat..until
while循环与其他语言循环几乎相同。
repeat..until在lua5.1之后和其他语言有一些细微的不同,就是在循环体的局部变量的作用域扩增到条件测试中,也就是until语句。

网友评论