Lua之table

来源:互联网 发布:手机数据恢复软件免费版 编辑:程序博客网 时间:2024/05/20 05:27

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是空的

1local a = {}

2、对a进行处理

3、对a是否为空表进行判断

关于对a是否为空表的判断,如果直接这样做:

if a == {} then

这样的结果就是a == {}永远返回false,是一个逻辑错误。因为这里比较的是table a和一个匿名table的内存地址。

也有些代码如此做:

if table.maxn(a) == 0 then

这样做也不保险,除非tablekey都是数字,而没有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处理,没有办法达到期望的排序结果,我们需要先pairskey装载一个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

0 0