Programming in Lua, 2Nd Edition - Chapter 19: The Table Library

本文深入介绍了Lua中的table库,包括如何使用table.insert和table.remove来插入和移除表中的元素,table.sort对数组进行排序的方法,以及table.concat用于连接字符串列表的功能。通过示例展示了这些函数的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

 

 

Chapter 19: The Table Library

 

table 库包含操作表和数组的辅助函数。table 库提供了从列表中插入和移除元素,对数组的元素进行排序,连接数组中的所有string 的函数

 


 

19.1 Insert and Remove

 

如果t 是数组{10,20,30},调用table.insert(t,1,15) t 变成{15,10,20,30}。如果调用insert 时不含位置信息,默认在数组的尾部插入。

 

t = {}

for line in io.lines() do

table.insert(t, line)

end

print(#t) --> (number of lines read)

 

Lua 5.0 中这种惯用法很常用。)

 

Lua 5.1 中的做法:

 

t = {}

for line in io.lines() do

       t[#t+1]=line

end

print(#t) --> (number of lines read)

 

 

table.remove 从数组中指定的位置移除元素,并且这可能会导至其它元素往某个方向移动一个位置。如果调用时不含位置信息,默认移除最后一个元素。

 

19.2 Sort

 

table.sort 的第一个参数是待排序的数组,第二个参数是可选的排序函数。如果不提供排序函数则默认从小到大排序(对应’<’ 运算符)。

 

一种常见的错误是试图排序表的indices。如果你想排序它们,你要把它们拷贝到一个数组,然后再进行排序。


 

按字典序输出表的key

 

lines = {

       luaH_set = 10,

       luaH_get = 24,

       luaH_present = 48,

}

 

a = {}

for n in pairs(lines) do a[#a + 1] = n end  -- lines 表的key 存进新数组

table.sort(a)                         -- 排序key

for i,n in ipairs(a) do print(n) end

 

 

以表的key 的字典序遍历表的迭代器

 

function pairsByKeys (t, f)

       local a = {}

       for n in pairs(t) do a[#a + 1] = n end

       table.sort(a, f)

       local i = 0 -- iterator variable

       return function () -- iterator function

              i = i + 1

              return a[i], t[a[i]]  -- 返回表的keyvalue

         end

end

 

lines = {

       luaH_set = 10,

       luaH_get = 24,

       luaH_present = 48,

}

 

for i, v in pairsByKeys(lines) do

       print(i, v)

end

 


 

19.3 Concatenation

 

table.concat 我们已经在11.6 节看到过了。它接受一个strings 的列表,返回的结果是所有strings 连接在一起的一个strings。第二个可选参数是一个作为分隔符的string,它会反复插在两string 之间。还有第三,四个可选参数,它们指定了连接操作从哪里开始和到那里结束

 

下面的函数是table.concat 的一个有趣泛化版实现。它接受嵌套的stirngs 列表:

 

function rconcat (l)

       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

 

print(rconcat{{"a", {" nice"}}, " and", {{" long"}, {" list"}}})

print(rconcat{"a"," nice"," and"," long"," list"})

--> a nice and long list

--> a nice and long list

 

rconcat 的参数可以是嵌套的表,也可以不是。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值