Lua中所有数组、符号表、集合、记录、队列和其他数据结构都是通过table实现,也可以通过table来实现模块(module)、包(package)和对象(Object)。table是对象,可以类比Java中的数组b['name']和b.name等价,而对于数字只能使用b['3']的形式,同Javascript一样,当没有table的引用时,Lua的垃圾回收器最终回收table。
Table的初始化等相关操作是非常简单的,这儿就不一一列举,介绍一下table的特性,和使用过程中需要注意的地方:
Table特性
1.table是一个“关联数组”,数组的索引可以是数字或者是字符串
2.table 的默认初始索引一般以 1 开始
3.table 的变量只是一个地址引用,对 table 的操作不会产生数据影响
4.table 不会固定长度大小,有新数据插入时长度会自动增长
5.table的长度可以通过#获取(#还可以获取字符串的长度),在第一次碰到nil时,就认为是结束标志
获取table的长度:table.getn(t)等价于 #
但是它计算的是数组元素。不包括hash键值,而且数组是以第一个nil元素来判断数组结束。
#只计算array的元素个数,它实际上调用了对象的metatable 的__len函数。
对于有__len 方法的函数返回函数返回值。不然就返回数组成员数目。
Lua中如何判断Table是空的
1、local a = {}
2、对a进行处理
3、对a是否为空表进行判断
关于对a是否为空表的判断,如果直接这样做:
if a == {} then
这样的结果就是a == {}永远返回false,是一个逻辑错误。因为这里比较的是table a和一个匿名table的内存地址。
也有些代码如此做:
if table.maxn(a) == 0 then
这样做也不保险,除非table的key都是数字,而没有hash部分。
难道真的要遍历table发现有东西就return false跳出才能断定它是否为空吗?这样做是可以的,至少目前项目中前人是这么封装的,不过代码太难看.
lua内置的next函数,即如此用:if next(a) == nil then
next其实就是pairs遍历table时用来取下一个内容的函数.
table排序(sort):
因为所有的数据结构都是通过table实现的,因此table的排序方法十分常用:
Table的排序函数是table.sort有两个参数,第一个是排序的集合,第二个参数是排序function。
如果没有第二个参数的情况下,默认是升序排列
例如
tb = {20, 10, 2, 3}
table.sort(tb)
for _, v in ipairs(tb) do
print(v)
End
结果:
2
3
10
20
修改为降序排列:
table.sort(tb,function(a,b) if a>b then return true end end)
for _, v in ipairs(tb) do
print(v)
End
结果:
20
10
3
2
很多时候我们相对表的key进行排序,这时候简单的对table进行sort处理,没有办法达到期望的排序结果,我们需要先pairs将key装载一个array中,对key进行sort,然后再根据排好顺序的key获取value,这种方式也是非常简单的,就不再写demo了,直接借用果冻(http://www.jellythink.com/archives/539)的例子吧:
local tb = {x = 20, z = 10, y = 30, m = 2, n = 8} -- 这是一个key无序的table
local keyTb = {}
for k, _ in pairs(tb) do
keyTb[#keyTb + 1] = k
end
table.sort(keyTb)
for _, v in ipairs(keyTb) do
print(v .. " = " .. tb[v])
end
Table常用的库函数:
有很多对table库函数的介绍,在list一遍没有意义,直接参考:
http://www.runoob.com/lua/lua-tables.html