Lua table(表)
Lua table 是Lua特有的功能强大的数据结构,用来创建不同的数据类型,数组、字典等。 Lua table 用关联型数组,用任意类型的值来作数组的索引,这个值不能是 nil。 Lua table 大小不固定,根据需要扩容,Lua通过table来解决模块(module)、包(package)和对象(Object)
如string.format 用"format" 索引table string
table(表)的构造
构造器是创建和初始化表的表达式。
表是Lua特有的功能强大的东西。最简单的构造函数是{},创建一个空表。直接初始化数组:
mytable = {}
-- 指定值
mytable[1]= "Lua"
-- 移除引用
mytable = nil
-- lua 垃圾回收会释放内存
当为 table a 并设置元素,将 a 赋值给 b,则 a 与 b 指向同一内存。如果 a 设置为 nil,则 b 同样能访问 table 的元素。
如果没有指定的变量指向a,Lua的垃圾回收机制会清理相对应的内存。
实例
mytable = {}
print("mytable 的类型是 ",type(mytable)) --table
mytable[1]= "Lua"
mytable["wow"] = "修改前"
print("mytable 索引为 1 的元素是 ", mytable[1])
print("mytable 索引为 wow 的元素是 ", mytable["wow"])
-- alternatetable和mytable的是指同一个 table
alternatetable = mytable
print("alternatetable 索引为 1 的元素是 ", alternatetable[1])
print("mytable 索引为 wow 的元素是 ", alternatetable["wow"])
alternatetable["wow"] = "修改后"
print("mytable 索引为 wow 的元素是 ", mytable["wow"])
-- 释放变量
alternatetable = nil
print("alternatetable 是 ", alternatetable)
-- mytable 仍然可以访问
print("mytable 索引为 wow 的元素是 ", mytable["wow"])
mytable = nil
print("mytable 是 ", mytable)
以上代码执行结果为:
mytable 的类型是 table mytable 索引为 1 的元素是 Lua mytable 索引为 wow 的元素是 修改前 alternatetable 索引为 1 的元素是 Lua mytable 索引为 wow 的元素是 修改前 mytable 索引为 wow 的元素是 修改后 alternatetable 是 nil mytable 索引为 wow 的元素是 修改后 mytable 是 nil
Table 操作
Table 操作常用的方法
序号 | 方法 & 用途 |
---|---|
1 | table.concat (table [, sep [, start [, end]]]): concat是concatenate(连锁, 连接)的缩写 |
2 | table.insert (table, [pos,] value): 在table数组部分指定位置(pos)插入值为value的一个元素 |
3 | table.maxn (table) 指定table中所有正数key值中最大的key值. 不存在key值为正数的元素, 则返回0(Lua5.2之后该方法已经不存在了) |
4 | table.remove (table [, pos]) 返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起 |
5 | table.sort (table [, comp]) 对给定的table升序排序 |
Table 连接
用 concat() 输出一个列表中元素连接成的字符串
实例
-- 返回 table 连接后的字符串
print("连接后的字符串 ",table.concat(fruits))
-- 指定连接字符
print("连接后的字符串 ",table.concat(fruits,", "))
-- 指定索引来连接 table
print("连接后的字符串 ",table.concat(fruits,", ", 2,3))
执行以上代码输出结果为:
连接后的字符串 bananaorangeapple 连接后的字符串 banana, orange, apple 连接后的字符串 orange, apple
插入和移除
table 的插入和移除操作
实例
-- 在末尾插入
table.insert(fruits,"mango")
print("索引为 4 的元素为 ",fruits[4])
-- 在索引为 2 的键处插入
table.insert(fruits,2,"grapes")
print("索引为 2 的元素为 ",fruits[2])
print("最后一个元素为 ",fruits[5])
table.remove(fruits)
print("移除后最后一个元素为 ",fruits[5])
执行以上代码输出结果为:
索引为 4 的元素为 mango 索引为 2 的元素为 grapes 最后一个元素为 mango 移除后最后一个元素为 nil
Table 排序
sort() 方法的使用,用于对 Table 进行排序
实例
print("排序前")
for k,v in ipairs(fruits) do
print(k,v)
end
table.sort(fruits)
print("排序后")
for k,v in ipairs(fruits) do
print(k,v)
end
执行以上代码输出结果为:
排序前 1 banana 2 orange 3 apple 4 grapes 排序后 1 apple 2 banana 3 grapes 4 orange
Table 最大值
table.maxn 在 Lua5.2 之后该方法已经不存在了,定义了 table_maxn 方法来实现。
获取 table 中的最大值:
实例
local mn=nil;
for k, v in pairs(t) do
if(mn==nil) then
mn=v
end
if mn < v then
mn = v
end
end
return mn
end
tbl = {[1] = 2, [2] = 6, [3] = 34, [26] =5}
print("tbl 最大值:", table_maxn(tbl))
print("tbl 长度 ", #tbl)
执行以上代码输出结果为:
tbl 最大值: 34 tbl 长度 3
注意:
当获取 table 的长度的时候无论是使用 # 还是 table.getn 其都会在索引中断的地方停止计数,而导致无法正确取得 table 的长度。
可以使用以下方法来代替:
function table_leng(t) local leng=0 for k, v in pairs(t) do leng=leng+1 end return leng; end
文人墨客
排序自定义排序规则时,大体规则是传参数 (a,b),当 return true 时,则 a 排在 b 前,否则相反。
文人墨客
table 泛型元素去重, 只要元素支持 == 比较。
要写成完全的泛型,那么 v==a[i] 改成一个比较函数的指针 equal(v,a[i]):
文人墨客
排序支持自定义排序规则,比如:
文人墨客
文人墨客
数组去重
结果:
文人墨客
table 去重