Lua中的table学习笔记
table在Lua里是一种重要的数据结构,它可以说是其他数据结构的基础,通常的数组、记录、线性表、队列、集合等数据结构都可以用table来表示,甚至连全局变量(_G)、模块、元表(metatable)等这些重要的Lua元素都是table的结构。可以说,table 是一个强大而又神奇的东西。
table特性
在之前介绍Lua数据类型时,也说过了table的一些特性,简单列举如下(详情可查看之前的介绍):
1.table是一个“关联数组”,数组的索引可以是数字或者是字符串
2.table的默认初始索引一般以1开始
3.table的变量只是一个地址引用,对table的操作不会产生数据影响
4.table不会固定长度大小,有新数据插入时长度会自动增长
5.table的方法函数
Lua5.2.2内置有以下7中对table操作的方法:
concat
函数table.concat主要用来把表里的每个元素通过一个分隔符(separator)连接组合起来,用法:
table.concat(table,sep, start,end)
上面除table外,sep、start、end这三个参数都是可选的,并且顺序读入的,如果没指定传入,函数concat会采用默认值(分隔符sep的默认值是空字符,start的默认值是1,end的默认值是数组部分的总长)去执行。
localtbl={"apple","pear","orange","grape"} print(table.concat(tbl)) print(table.concat(tbl,"、")) print(table.concat(tbl,"、",2)) print(table.concat(tbl,"、",2,3))
对于密集型的字符并接,table.concat比用".."连接更高效,下面是用time测试的效果:
localstr={} fori=1,10000do str[i]="str" end print(table.concat(str)) --real 0m0.005s --user 0m0.003s --sys 0m0.002s
localstr="" fori=1,10000do str=str.."str" end print(str) --real 0m0.041s --user 0m0.037s --sys 0m0.002s
insert
函数table.insert用于向table的指定位置(pos)插入一个新元素,用法:
table.insert(table,posvalue)
参数pos是可选,默认是table末尾位置。
localtbl={"apple","pear","orange","grape"} table.insert(tbl,"watermelon") print(table.concat(tbl,"、")) table.insert(tbl,2,"watermelon") print(table.concat(tbl,"、"))
maxn
函数table.maxn是返回table最大的正数索引值,用法:
table.maxn(table)
如果不存在正数的索引值,则返回0。
localtbl={"apple","pear","orange","grape"} print(table.maxn(tbl)) localtbl={"apple","pear","orange","grape",[26]="watermelon"} print(table.maxn(tbl)) localtbl={[-1]="apple",[-2]="pear",[-3]="orange",[-4]="grape"} print(table.maxn(tbl))
pack
函数table.pack是获取一个索引从1开始的参数表table,并会对这个table预定义一个字段n,表示该表的长度,用法:
table.pack(···)
该函数常用在获取传入函数的参数。
functiontable_pack(param,...) localarg=table.pack(...) print("thisargtablelengthis",arg.n) fori=1,arg.ndo print(i,arg[i]) end end table_pack("test","param1","param2","param3")
remove
函数table.remove用于删除table里某个值,用法:
table.remove(list[,pos])
参数pos可选,默认为删除table最后一个元素,并且参数pos的类型只能是数字number类型。
localtbl={"apple","pear","orange","grape"} table.remove(tbl,2) print(table.concat(tbl,"、")) table.remove(tbl) print(table.concat(tbl,"、"))
sort
函数table.sort用于对table里的元素作排序操作,用法:
table.sort(table,comp)
参数comp是一个排序对比函数,它有两个参数param1、param2,如果param1排在param2前面,那么排序函数返回true,否则返回false。
localtbl={"apple","pear","orange","grape"} localsort_func1=function(a,b)returna>bend table.sort(tbl,sort_func1) print(table.concat(tbl,"、")) localsort_func2=function(a,b)returna<bend table.sort(tbl,sort_func2) print(table.concat(tbl,"、"))
参数comp可选,缺省comp的情况下是对表作升序排序。
localtbl={"apple","pear","orange","grape"} table.sort(tbl) print(table.concat(tbl,"、"))
unpack
函数table.unpack用于返回table里的元素,用法:
table.unpack(table,start,end)
参数start是开始返回的元素位置,默认是1,参数end是返回最后一个元素的位置,默认是table最后一个元素的位置,参数start、end都是可选
localtbl={"apple","pear","orange","grape"} print(table.unpack(tbl)) locala,b,c,d=table.unpack(tbl) print(a,b,c,d) print(table.unpack(tbl,2)) print(table.unpack(tbl,2,3))