table(表)
table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数字、字典等。
Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。
Lua table 是不固定大小的,你可以根据自己需要进行扩容。
Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。 例如string.format表示使用”format”来索引table string。
table类似于哈希表。table中的key可以是任何类型的值(除了nil)。table的创建是通过构造表达式完成的。最简单的构造表达式就是{},也可以在表里添加一些数据,直接初始化表:
-- 创建一个空的 table
local tbl1 = {}
-- 直接初始表
local tbl2 = {"apple", "pear", "orange", "grape"}
Lua 中的表(table)其实是一个”关联数组”(associative arrays),数组的索引可以是数字或者是字符串。
- *
a = {}
a["key"] = "value"
key = 10
a[key] = 22
a[key] = a[key] + 11
for k, v in pairs(a) do
print(k .. " : " .. v) -- key : value 10 : 33
end
*
当我们为 table a 并设置元素,然后将 a 赋值给 b,则 a 与 b 都指向同一个内存。如果 a 设置为 nil ,则 b 同样能访问 table 的元素。如果没有指定的变量指向a,Lua的垃圾回收机制会清理相对应的内存。
以下实例演示了以上的描述情况
father = { house=1 } --创建一个表,并且存储house值
son = { car=2 } --创建一个表,并且存储car值
son=father; --son这时候也引用了father这个表
print(son.house); --所以输出为1.
son["house"]=20; --与son.house相等
print(father["house"]) --20,
father=nil; --father不再引用table
print(son["house"]) --20
*
--若要表示一个传统的数组或者线性表,只需以整数作为key来使用table即可
--不同于许多语言,lua习惯以1作为数组开始
a = {}
for i = 1,5 do
a[i] = i --注意是以1作为数组开始
end
--#长度操作符,可获取table或者字符串的长度
for i = 1,#a do
print(a[i]); --1 2 3 4 5
end
print(a[#a]) --5
a[#a] = nil --删除a[5]
a[#a+1] = 10 --a[5]=10
print(a[#a]) --10
*
对于所有未初始化的元素的索引结果都是nil。lua将nil作为界定数组结尾的标志。如果数组中含有nil,此时使用#就不安全了,可以使用table.maxn,它将返回一个table的最大正索引数。
a = {}
for i = 1,5 do
a[i] = i
end
a[4] = nil
print(#a) --3
print(table.maxn(a)) --5
table三种初始化方式:
- 1
days = {"Sunday","Monday","Tuseday"} --索引默认从1开始
- 2
a = {x = 10,y = 20} --等价于a={};a.x=10;a.y=20
- 3
opnames = { ["+"] = "add", ["-"] = "sub", ["*"] = "mul", ["/"] = "div",
}
table操作
以下列出了 Table 操作常用的方法:
- 1 连接
table.concat(table,sep,start,end)
sep:指定连接符作为连接,start 开始连接索引,end结束索引,都是可选参数。
实例:
fruits = {"banana","orange","apple"}
-- 返回 table 连接后的字符串
print("连接后的字符串 ",table.concat(fruits))
-- 指定连接字符
print("连接后的字符串 ",table.concat(fruits,", "))
-- 指定索引来连接 table
print("连接后的字符串 ",table.concat(fruits,", ", 2,3))
执行结果:
连接后的字符串 bananaorangeapple
连接后的字符串 banana, orange, apple
连接后的字符串 orange, apple
- 2 插入
table.insert(table,pos,value)
在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾。
实例:
-- 在末尾插入
table.insert(fruits,"mango")
print("索引为 4 的元素为 ",fruits[4])
-- 在索引为 2 的键处插入
table.insert(fruits,2,"grapes")
print("索引为 2 的元素为 ",fruits[2])
for i,v in ipairs(fruits) do
print(fruits[i]);
end
执行结果:
索引为 4 的元素为 mango
索引为 2 的元素为 grapes
banana
grapes
orange
apple
mango
- 3 移除
table.remove(table,pos)
返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。
实例:
table.remove(fruits)
print("移除后最后一个元素为 ",fruits[5])
for i,v in ipairs(fruits) do
print(fruits[i]);
end
执行结果:
移除后最后一个元素为 nil
banana
grapes
orange
apple
- 4 排序
table.sort(table,comp)
对给定的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