Lua table (表)
table 是 Lua 中最重要的一种数据结构,也是一个最重要的数据类型。
Lua table 使用关联型数组实现,因此我们可以用任意类型的值来作数组的索引。 但这个值不能是 nil
Lua table 是不固定大小的,可以随着程序的需要随时扩容
Lua 中的模块(module)、包(package) 和对象 (Object) 都是通过 table 来实现的
table 的初始化
table 最简单的初始化方式是使用一对大括号 {}
,但它只会创建一个空表
-- 初始化空表 mytable = {}
然后就可以向数组一样给 table 赋值
-- 初始化空表 mytable = {} -- 指定值 mytable[1]= "Lua" mytable["name"] = "简单教程,简单编程"
如果要删除一个 table,可以把 nil 赋值给它
把 nil
赋值给 table,就可以删除 table, Lua 的垃圾回收会释放内存
-- 移除引用 mytable = nil -- lua 垃圾回收会释放内存
如果把 table 赋值给另一个变量,那么两个变量将指向同一个 table,此时如果删除了其中一个,那么另一个还是能够访问到这个 table
-- !/usr/bin/lua -- -*- encoding:utf-8 -*- -- filename: main.lua -- author: 简单教程(www.twle.cn) -- Copyright © 2015-2065 www.twle.cn. All rights reserved. -- 定义一个 table mytable1 = {} mytable1['name'] = '简单教程,简单编程' -- 将 mytable1 赋值给 mytable2 mytable2 = mytable1 -- 删除 mytable1 mytable1 = nil -- mytable2 仍然可以访问 io.write(mytable2['name'],"\n")
运行以上脚本,输出结果如下
$ lua main.lua 简单教程,简单编程
范例 : 下面这个范例演示了 table 的初始化和赋值
-- !/usr/bin/lua -- -*- encoding:utf-8 -*- -- filename: main.lua -- author: 简单教程(www.twle.cn) -- Copyright © 2015-2065 www.twle.cn. All rights reserved. mytable = {} print("mytable 的类型是 ",type(mytable)) 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)
运行以上 Lua 脚本,输出结果如下:
$ lua main.lua mytable 的类型是 table mytable 索引为 1 的元素是 Lua mytable 索引为 wow 的元素是 修改前 alternatetable 索引为 1 的元素是 Lua mytable 索引为 wow 的元素是 修改前 mytable 索引为 wow 的元素是 修改后 alternatetable 是 nil mytable 索引为 wow 的元素是 修改后 mytable 是 nil
Lua table 的方法
下面列出了 table 的常用方法
-
- table.concat (table [, sep [, start [, end]]])
- concat 是 concatenate (连锁, 连接) 的缩写. table.concat() 函数列出参数中指定 table 的数组部分从 start 位置到 end 位置的所有元素, 元素间以指定的分隔符(sep)隔开
-
- table.insert (table, [pos,] value)
- 在 table 的数组部分指定位置(pos)插入值为 value 的一个元素 pos 参数可选, 默认为数组部分末尾
-
- table.maxn (table)
- 指定 table 中所有正数 key 值中最大的 key 值 如果不存在key值为正数的元素, 则返回0
Lua5.2之后该方法已经不存在了,本文使用了自定义函数实现
-
- table.remove (table [, pos])
- 返回并移除 table 数组部分位于 pos 位置的元素 其后的元素会被前移 pos参数可选, 默认为 table 长度, 即从最后一个元素删起
-
- table.sort (table [, comp])
- 对给定的table进行升序排序
table.concat 函数
table.concat 函数可以用来两个 table
-- !/usr/bin/lua -- -*- encoding:utf-8 -*- -- filename: main.lua -- author: 简单教程(www.twle.cn) -- Copyright © 2015-2065 www.twle.cn. All rights reserved. fruits = {"banana","orange","apple"} -- 返回 table 连接后的字符串 print("连接后的字符串 ",table.concat(fruits)) -- 指定连接字符 print("连接后的字符串 ",table.concat(fruits,", ")) -- 指定索引来连接 table print("连接后的字符串 ",table.concat(fruits,", ", 2,3))
运行以上 Lua 脚本,输出结果如下
$ lua main.lua 连接后的字符串 bananaorangeapple 连接后的字符串 banana, orange, apple 连接后的字符串 orange, apple
table.insert 函数
table.insert 函数用来向 table 插入一个元素
-- !/usr/bin/lua -- -*- encoding:utf-8 -*- -- filename: main.lua -- author: 简单教程(www.twle.cn) -- Copyright © 2015-2065 www.twle.cn. All rights reserved. fruits = {"banana","orange","apple"} -- 在末尾插入 table.insert(fruits,"mango") print("索引为 4 的元素为 ",fruits[4]) -- 在索引为 2 的键处插入 table.insert(fruits,2,"grapes") print("索引为 2 的元素为 ",fruits[2]) -- 显示全部元素 print( table.concat(fruits,' '))
运行以上脚本,输出结果如下
$ lua main.lua 索引为 4 的元素为 mango 索引为 2 的元素为 grapes banana grapes orange apple mango
table.remove 函数
table.remove 函数用来移除并返回 table 中的元素
-- !/usr/bin/lua -- -*- encoding:utf-8 -*- -- filename: main.lua -- author: 简单教程(www.twle.cn) -- Copyright © 2015-2065 www.twle.cn. All rights reserved. fruits = {"banana", "grapes", "orange", "apple","mango"} print("remove 前",table.concat(fruits,",")) -- 移除最后一个元素 last = table.remove(fruits) print("移除的元素是:",last) print("remove 后",table.concat(fruits,","))
运行以上 Lua 脚本,输出结果如下
$ lua main.lua remove 前 banana,grapes,orange,apple,mango 移除的元素是: mango remove 后 banana,grapes,orange,apple
table.sort
table.sort 函数用来给 table 排序
table.sort 会改变原来的 table
-- !/usr/bin/lua -- -*- encoding:utf-8 -*- -- filename: main.lua -- author: 简单教程(www.twle.cn) -- Copyright © 2015-2065 www.twle.cn. All rights reserved. fruits = {"banana","orange","apple","grapes"} 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
运行以上 Lua 脚本,输出结果如下
$ lua main.lua 排序前 1 banana 2 orange 3 apple 4 grapes 排序后 1 apple 2 banana 3 grapes 4 orange
table.maxn 函数
table.maxn 函数返回 table 中所有正数 key 值中最大的 key 值
如果不存在key值为正数的元素, 则返回0
Lua5.2之后该方法已经不存在了,本课程自己定义了一个
-- !/usr/bin/lua -- -*- encoding:utf-8 -*- -- filename: main.lua -- author: 简单教程(www.twle.cn) -- Copyright © 2015-2065 www.twle.cn. All rights reserved. function table_maxn(t) local mn = 0 for k, v in pairs(t) do if mn < k then mn = k end end return mn end tbl = {[1] = "a", [2] = "b", [3] = "c", [26] = "z"} print("tbl 长度 ", #tbl) print("tbl 最大值 ", table_maxn(tbl))
运行以上 Lua 脚本,输出结果如下
$ lua main.lua tbl 长度 3 tbl 最大值 26