Lua整理——table库
table属性table库是有一些辅助函数构成的,这些函数将table作为数组来操作。其中,有对列表中插入和删除元素的函数,有对数组元素进行排序的函数,还有对链接一个数组中所有字符串的函数。
这个传统的约定有一个弊端:我们的?array中不能拥有?nil?元素。对大部分应用来说这个限制不是什么问题,比如当所有的?array?有固定的类型的时候。但有些时候我们的?array?需要拥有?nil?元素,这种情况下,我们需要一种方法来明确的表明?array的大小.?
eg:如果a是一个数组{10,20,30},调用table.insert(a,1,15)后,a变为{15,10,30}。经常使用的一个特殊情况是,我们不带位置参数调用insert,将会在array最后位置插入元素(所以不需要元素移动)。
使用这两个函数,很容易实现栈、队列和双端队列。我们可以初始化结构为a={}。一个push操作等价于table.insert(a,x);一个pop操作等价于table.remove(a)。要在结构的另一端结尾插入元素我们使用table.insert(a,x);删除元素用table.remove(a,1)。最后两个操作不是特别有效的,因为他们必须来回移动元素。然而,因为table库这些函数使用C实现,对于小的数组(几百个元素)来说效率都不会有什么问题。?
排序函数有两个参数并且如果在array中排序后第一个参数在第二个参数前面,排序函数必须返回true。如果未提供排序函数,sort使用默认的小于操作符进行比较。默认是升序。一个常见的错误是企图对表的下标域进行排序。在一个表中,所有下标组成一个集合,但是无序的。如果你想对他们排序,必须将他们复制到一个array然后对这个array排序。 对于Lua来说,数组也是无序的。但是我们知道怎样去计数,因此只要我们使用排序好的下标访问数组就可以得到排好序的函数名。这就是为什么我们一直使用ipairs而不是pairs遍历数组的原因。前者使用key的顺序1、2、……(ipairs),后者表的自然存储顺序(pairs)。
local myTable = {19,"iron","clay",} local result = table.concat(myTable) print(result) --> 19iron10clay result = table.concat(myTable," space ") print(result) --> 19 space iron space 10 space clay result = table.concat(myTable," - ",2) print(result) --> iron - 10 - clay result = table.concat(myTable,2,3) print(result) --> iron - 10 table长度大小总结--table.getn()与#table是一样的 --(a)有序table local t1 = {1,3} print(table.getn(t1),"--",#t1,table.maxn(t1))--3 -- 3 3 --(b)无序table local t2 = {"d",a=2,3} print(table.getn(t2),#t2,table.maxn(t2))--2 -- 2 2 --首先,要明白,这个t2不是一个简单的table,它混合了列表(list)和记录(record)两种风格,表中,a = 2是record风格。其次,要明白,record风格的record是不作为外表的长度计算。你可以把它想象成一个函数,跟其他面向对象语言一样,函数是不记为内部变量的。既然像函数一样,那就可以输出a的值,是的。print(t2.a)就可以了。 local t3 = {1,{a=2},3} print(table.getn(t3),#t3)--3 -- 3 --表嵌套表,嵌套表也是元素。print(t3[2].a)输出2 local t4 = {1,nil} print(table.getn(t4),#t4)--1 -- 1 --table获取长度的时候,会遍历一下整个表,在最后一个非nil处,就会返回。 local t5 = {1,nil,3} print(table.getn(t5),#t5)--3 -- 3 --继续往下写是没有完全有规律的 --无序table local table2 = {["bb"] = 1,["cc"] = 2,["dd"] = 3,["ee"] = nil,["ff"] = 4,} print("-----------",#table2) ------------- 0 --可以这么理解:把它想象成一个函数,跟其他面向对象语言一样,函数是不记为内部变量的。既然像函数一样,那就可以输出a的值,是的。print(t2.a)就可以了。 --计算无序table的大小,可以这样 local count = 0 for k,v in pairs(table2) do count = count + 1 end print("-----------",count) ------------- 4 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |