lua中的表处理

来源:互联网 发布:网络数字对讲机 编辑:程序博客网 时间:2024/06/05 09:09

前言:

lua中的表是很重要且常用的数据类型,熟悉其相关常用处理库函数是很重要的。

表处理库:

1.table.concat(table,sep,start,end)连接 数组value

参数:(表,连接符,开始位,结束位)   返回值:string

列出参数中指定table的数组部分从start位置到end位置的所有元素,元素间以指定的分隔符(sep)隔开。

除了table,其他参数均非必须,分隔符默认空字符,start默认1,end默认数组部分的总长。

e.g.tbl={"alpha","beta","gamma"}print(table.concat(tbl,","))--alpha,beta,gammaprint(table.concat(tbl,nil,1,2))--alphabetaprint(table.concat(tbl,"\n",2,3))--beta--gamma

注:1/ 若table[key为start到end]任意为空都会报错,所以要确保要连接的值都不为空;

        2/ sep,start,end这三参数是顺序读入的,所以虽然他们都不是必须参数,但如果要指定靠后的参数,必须同时指定前面的参数。

2.table.insert(table,pos,value)插入

参数:(表,位置索引1开始,要插入的值)  无返回值

在table的数组部分指定位置(pos)插入值为value的一个元素,数组部分pos位置后的元素后移。

pos参数可选,默认为数组部分末尾。

local tbl={"alpha","beta","gamma"}table.insert(tbl,"delta")   --默认插到数组末尾table.insert(tbl,"epsilon") --默认插到数组末尾print(table.concat(tbl,","))--alpha,beta,gamma,delta,epsilontable.insert(tbl,3,"zeta") --在索引3位置插入"zeta"print(table.concat(tbl,","))--alpha,beta,zeta,gamma,delta,epsilon
注:插入数据默认是插入到数组部分的末尾,即从1索引开始连续的key形成的数组:

local tbl={"alpha","beta","gamma"}tbl[7]="hi"table.insert(tbl,"delta")   --默认插到数组末尾for k,v in pairs(tbl) doprint("k:"..k..";v:"..v)endprint(table.concat(tbl,","))--k:1;v:alpha --k:2;v:beta --k:3;v:gamma --k:4;v:delta --k:7;v:hi--alpha,beta,gamma,delta

可以看到是插到数组部分的末尾的。

但是发现一个问题不知道什么情况,就是上例中我把tbl[6]赋值而不是7以后,再用concat连接会报5索引处为空,>5便不会有这种情况。
上例中说默认end为数组部分长度,但是tbl[6]赋值后,应该数组长度还是4吧?为什么会尝试连接5呢?知道的同学麻烦告知一下。

3.table.move(a1,f,e,t,a2)移动[略:版本不支持]

将元素从表a1移到表a2。操作等价于:a2[t],..=a1[f],...,a1[e],a2默认值为a1。

4.table.remove(table,pos)删除并返回

参数:(表,位置索引)  返回值:删除的元素

删除并返回table数组部分位于pos位置的元素,后面的数组部分元素会被前移

pos参数可选,默认为table长度,即从最后一个元素删起。

local tbl={"alpha","beta","gamma"}local t=table.remove(tbl,1)for k,v in pairs(tbl) doprint("k:"..k..";v:"..v)endprint("t:"..t)--k:1;v:beta --后面数组元素前移--k:2;v:gamma--t:alpha

5.table.sort(table,comp)表元素排序

参数:(表,排序方法)  无返回值

对给定的table进行排序

comp参数可选,默认升序排序;可以是一个外部函数,来自定义sort函数的排序标准。

此函数应满足:

接受两个参数(a,b),并返回一个bool值,当a应排在b前面时,返回true,否则返回false。

e.g.tbl={"alpha","beta","gamma","delta"}table.sort(tbl)print(table.concat(tbl,","))--alpha,beta,delta,gammasortFunc=function(a,b) return b<a endtable.sort(tbl,sortFunc)print(table.concat(tbl,","))--gamma,delta,beta,alpha
用类似的原理还可以写出更加复杂的排序函数。

如:有个table存有工会三名成员的姓名等级信息:

guide={}table.insert(guide,{name="Eam",class="Rogue",lv=70,})table.insert(guide,{name="Sini",class="Priest",lv=70,})table.insert(guide,{name="Marry",class="Warlock",lv=40,})
对这个table排序,规则:按等级升序排序,等级相同的按名称:

function sortLvNameAsc(a,b)       if a.lv==b.lv then            return a.name<b.name       else            return a.lv<b.lv       endend
测试:
table.sort(guide,sortLvNameAsc)for k,v in ipairs(guide) do     print(k,v.name)end--Marry--Eam--Sini

6.1/ table.foreachi(table,function(i,v))遍历执行方法

参数:(表,执行操作)  

会期望一个从1(数字1)开始的连续整数范围,遍历table中的key和value逐对进行function(i,v)操作

t1={2,4,6,version="5",10,web="hello"}table.foreachi(t1,function(i,v) print(i.."|"..v) end)--1|2--2|4--3|6--4|10
2/ table.foreach(table,function(i,v))遍历执行方法
与foreachi不同的是,foreach会对整个表进行迭代

t1={2,4,6,version="5",10,web="hello"}table.foreach(t1,function(i,v) print(i.."|"..v) end)--1|2--2|4--3|6--4|10--version|5--web|hello

7. table.maxn(table)最大正数key值

参数:(表)  

返回指定table中所有正数key值中最大的key值,如果不存在key值为正数的元素,则返回0,此函数不限于table的数组部分。

tbl={[1]="a",[2]="b",[3]="c",[26]="z"}print(table.maxn(tbl))--26tbl[95.5]=trueprint(table.maxn(tbl))--95.5

0 0