(1)数组
table可以定义一维、二维、多维数组,
无需声明长度,可以随时增加元素,
lua语言从1开始索引,与一般语言从零开始不同
同一数组组中的元素可以是任意类型
cities = {'北京','上海','广州'}
cities[4] = 114514
for i = 1,4 do
print('cities['..i..']='..cities[i])
end
-- 0作为索引不存在
print(cities[0])
结果
定义一个二维数组
--定义一个二维数组
arr = {}
for i = 1,3 do
arr[i] = {}
for j = 1,2 do
arr[i][j] = i * j
end
end
--逐项输出
for i = 1,3 do
for j = 1,2 do
print(arr[i][j])
end
end
结果
(2)Map
通过table定义 key-value键值对
通过下标方式操作
--定义一个map
emp = {name = "张山",age = 23, depart="销售部"}
-- 通过下标操作
emp["gender"] = "男"
print(emp["name"])
print(emp["gender"])
结果
通过点号方式操作
--定义一个map
emp = {name = "张山",age = 23, depart="销售部"}
-- 通过下标方式操作
--emp["gender"] = "男"
--print(emp["name"])
--print(emp["gender"])
-- 通过点号方式操作
emp.office = "2nd floor"
print(emp.age)
print(emp.office)
结果
定义一个map时,它的key可以是一个表达式的形式
---定义一个map,其key为表达式
a = 'xxx'
b = 3
c = 5
arr = {
['emp_'..a] = true,
[b + c] = 'hello',
['hi'] = 123
}
print(arr.emp_xxx)
print(arr[8])
print(arr.hi)
结果
注意,不能写成
print(arr.8)
这种形式,会报错
(3)混合模式
Lua允许key-value 和 数组 混合使用,且key-value不占用数组的索引
--混合模式
emp = {'北京',name = '张三',age = 23,'上海',depart = '销售部','广州','深圳'}
print(emp[1])
print(emp[2])
print(emp[3])
print(emp[4])
结果
混合模式常见用法
--混合模式常见用法
emps = {
{name = "张三",age =23},
{name = "李四",age =24},
{name = "王五",age =25},
{name = "赵六",age =26},
}
for i = 1,4 do
print(emps[i].name..':'..emps[i].age)
end
结果
(4)table的操作函数
Lua5.1的文档地址https://www.lua.org/manual/5.1/
下滑到index
table的操作函数
(a) table.concat (连接函数)
对数组的元素进行字符串拼接,
连接从start位置到end位置的所有元素
与key-value无关,仅仅连接数组元素
emp = {'北京',name = '张三',age = 23,'上海',depart = '销售部','广州','深圳'}
print("将所有数组元素拼接")
print(table.concat(emp))
print('#############################')
print('在元素中间加逗号')
print(table.concat(emp,','))
print('#############################')
print('从索引值为2的项开始拼接')
print(table.concat(emp,',',2))
print('#############################')
print('2开始,3结束')
print(table.concat(emp,',',2,3))
结果
table.concat不允许出现空
emp = {'北京',name = '张三',age = 23,'上海',depart = '销售部','广州',nil,'深圳'}
print(table.concat(emp))
报错
(b)table.insert (插入函数)
将数组元素插入的到指定位置,在没有传位置参数的情况下,默认为插入到末尾
cities = {'北京','上海','广州'}
--插入到指定位置
table.insert(cities,2,'深圳')
--插入到默认位置
table.insert(cities,'天津')
print(table.concat(cities,','))
结果
(c)table.maxn (求最大索引)
这个函数用来求table的最大索引,也就是table中的数组长度
--最大索引值(长度)
emp = {}
print(table.maxn(emp))
emp = {6,9,9,8,7,10}
print(table.maxn(emp))
emp = {'北京',name = '张三',age = 23,'上海',depart = '销售部','广州','深圳'}
print(table.maxn(emp))
结果
(d)table.remove (移除项)
与插入类似,移除数组指定元素,默认移除末尾元素
cities = {'北京','深圳','上海','广州','天津'}
--删除指定位置元素
table.remove(cities,2)
--删除默认位置元素
table.remove(cities)
print(table.concat(cities,','))
运行结果
(e)table.sort (排序)
该函数对指定的table中的数组元素进行升序排序
也可以通过传递函数的方式使其按规则排序
如果arr中既有字符串,又有字符型,那么对其排序就会报错
如果多个元素相同,则其相同的多个元素谁排在前面,谁在后面是不确定的
如果数组元素中包含nil,则排序就会报错
简单排序
cities = {'bj北京','sz深圳','sh上海','gz广州','tj天津'}
table.sort(cities)
print(table.concat(cities,','))
结果
降序排序
cities = {'bj北京','sz深圳','sh上海','gz广州','tj天津'}
--降序排序
table.sort(cities, function(a,b)
return a > b
end
)
print(table.concat(cities,','))
结果
错误排序方式
--数组中有nil
cities = {'bj北京','sz深圳','sh上海','gz广州',nil,'tj天津'}
table.sort(cities)
--数组中有两种类型
cities = {'bj北京','sz深圳','sh上海','gz广州',114514,'tj天津'}
table.sort(cities)