在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
第19章 Table库 1 print(table.getn{10,2,4}) --> 3 2 print(table.getn{10,2,nil}) --> 2 3 print(table.getn{10,2,nil; n=3}) --> 3 4 print(table.getn{n=1000}) --> 1000 5 a = {} 6 print(table.getn(a)) --> 0 7 table.setn(a, 10000) 8 print(table.getn(a)) --> 10000 9 a = {n=10} 10 print(table.getn(a)) --> 10 11 table.setn(a, 10000) 12 print(table.getn(a)) --> 10000 默认的,setn和getn使用内部表存储表的大小。这是最干净的选择,因为它不会使用额外的元素污染array。然而,使用n域的方法也有一些优点。在带有可变参数的函数种,Lua内核使用这种方法设置arg数组的大小,因为内核不依赖于库,他不能使用setn。另外一个好处在于:我们可以在array创建的时候直接初始化他的大小,如我们在上面例子中看到的。 19.2 插入/删除 1 a = {} 2 for line in io.lines() do 3 table.insert(a, line) 4 end 5 print(table.getn(a)) --> (number of lines read)
table.remove 函数删除数组中指定位置的元素,并返回这个元素,所有后面的元素前移,并且数组的大小改变。不带位置参数调用的时候,他删除array的最后一个元素。使用这两个函数,很容易实现栈、队列和双端队列。我们可以初始化结构为a={}。一个push操作等价于table.insert(a,x);一个pop操作等价于table.remove(a)。要在结构的另一端结尾插入元素我们使用table.insert(a,1,x);删除元素用table.remove(a,1)。最后两个操作不是特别有效的,因为他们必须来回移动元素。然而,因为table库这些函数使用C实现,对于小的数组(几百个元素)来说效率都不会有什么问题。 19.3 排序 另一个有用的函数是table.sort。他有两个参数:存放元素的array和排序函数。排序函数有两个参数并且如果在array中排序后第一个参数在第二个参数前面,排序函数必须返回true。如果未提供排序函数,sort使用默认的小于操作符进行比较。 一个常见的错误是企图对表的下标域进行排序。在一个表中,所有下标组成一个集合,但是无序的。如果你想对他们排序,必须将他们复制到一个array然后对这个array排序。我们看个例子,假定上面的读取源文件并创建了一个表,这个表给出了源文件中每一个函数被定义的地方的行号: 1 lines = { 2 luaH_set = 10, 3 luaH_get = 24, 4 luaH_present = 48, 5 } 现在你想以字母顺序打印出这些函数名,如果你使用pairs遍历这个表,函数名出现的顺序将是随机的。然而,你不能直接排序他们,因为这些名字是表的key。当你将这些函数名放到一个数组内,就可以对这个数组进行排序。首先,必须创建一个数组来保存这些函数名,然后排序他们,最后打印出结果: a = {} for n in pairs(lines) do table.insert(a, n) end table.sort(a) for i,n in ipairs(a) do print(n) end 注意,对于Lua来说,数组也是无序的。但是我们知道怎样去计数,因此只要我们使用排序好的下标访问数组就可以得到排好序的函数名。这就是为什么我们一直使用ipairs而不是pairs遍历数组的原因。前者使用key的顺序1、2、⋯⋯,后者表的自然存储顺序。 function pairsByKeys (t, f) local a = {} for n in pairs(t) do table.insert(a, n) end table.sort(a, f) local i = 0 -- iterator variable local iter = function () -- iterator function i = i + 1 if a[i] == nil then return nil else return a[i], t[a[i]] end end return iter end
有了这个函数,很容易以字母顺序打印这些函数名,循环: for name, line in pairsByKeys(lines) do print(name, line) end 打印结果: luaH_get 24 luaH_present 48 luaH_set 10
|
请发表评论