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 的常用方法

  1. table.concat (table [, sep [, start [, end]]])
    concat 是 concatenate (连锁, 连接) 的缩写. table.concat() 函数列出参数中指定 table 的数组部分从 start 位置到 end 位置的所有元素, 元素间以指定的分隔符(sep)隔开
  2. table.insert (table, [pos,] value)
    在 table 的数组部分指定位置(pos)插入值为 value 的一个元素 pos 参数可选, 默认为数组部分末尾
  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.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
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.