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