日期:2014.7.23
PartⅢ The Standard Libraries
20 The Table Library
table库包含一些辅助函数用以类似与数组一样操作table。提供了从list内插入和删除元素的操作,对数组的元素进行排序的操作,将table中所有的string连接起来的操作。
20.1 Insert and Remove
Insert
table的insert操作有三个参数:要被插入数据的table;插入的位置;插入的值。如果插入的位置不是最后一个,那么lua会将该位置至最后一个位置的元素的位置后移一位,如:当前table的t = {10,20,30},此时执行table.insert(t,1,25),即在t的第一个位置插入数据25,得到的结果为 t = {25,10,20,30},位置1及之后的数据位置后移,然后将新的元素插入至1号位置。假如没有提供要插入的位置这个参数,那么默认插入的位置是table的最后的位置,此时不需要移动其他的元素。
Remove
table的remove操作将会移除table中给定位置的一个元素,在这位置之后的元素位置前移,如果没有提供需要移除的位置这个参数,则默认移除最后一个元素。
使用这两个运算函数便可以直观的实现栈、队列、双端队列。使用table初始化一个数据结构,t = {},在尾部添加元素:table.insert(t,x);删除尾部的元素:table.remove(t);由于table库是以c语言来实现这两个函数的,所以在效率上是有保障的。
20.2 Sort
table.sort函数。该函数的参数有两个,一个为需要排序的table,另一个是提供排序规则的函数。排序函数需要有两个参数,并且当第一个参数达到了排序规则的要求(假如递增排序的情况,第一个参数大于了第二个参数),那么此时就需要返回true。
遍历数组的时候推荐使用ipairs而不是pairs,因为前者以1、2、3的顺序遍历,而后者是以任意的顺序来遍历的。
当我们需要对table的目录进行排序的时候,需要将这些目录首先存储至一个数组,然后再对数组进行排序。因为table中的目录没有顺序可言。
e.g. lines = { luaH_set = 10, luaH_get = 23, luaH_present = 48, } table.sort( lines ) for n in pairs(lines) do print(n) end
此时打印出来的是:luaH_set、luaH_present、luaH_get,并没有按照顺序来排列
e.g. a = {} for n in pairs(lines) do a[#a + 1] = n end table.sort(a) for _, n in ipairs(a) do print(n) end
此时打印出来的是:luaH_get、luaH_present、luaH_set,此时便是按照字典顺序对table的目录进行了排序。
使用迭代器来实现排序:
function pairsByKeys( t,f ) --参数f可以提供自定义的排序方法 local a = {} for n in pairs(t) do a[#a + 1] = n end table.sort(a,f) local i = 0 return function ( ) i = i + 1 return a[i],t[a[i]] end end for name,line in pairsByKeys(lines) do print(name,line) end
20.3 Concatenation
使用table.concat函数将一串string型变量作为参数,返回的结果是将这些string型变量连接起来。接受一个额外参数作为每个string型变量直接的连接符,默认是没有的。该函数也接受额外的两个参数:用来指定返回结果的第一个和最后一个string型变量。
下面这个函数
function rconcat( l , s) if type(l) ~= "table" then return l end local res = {} for i = 1,#l do res[i] = rconcat(l[i]) end return table.concat(res) end
所实现的功能是将一个嵌套多个table的table进行连接,返回连接结果。