Lua编程笔录--Lua初识及语法四(数组,迭代器,table表)

来源:互联网 发布:python partial 编辑:程序博客网 时间:2024/05/21 18:32

前言:前面的知识点可以参考 
Lua编程笔录--Lua初识及语法一(注释,变量命名,全局/局部变量,数据类型)

Lua编程笔录--Lua初识及语法二(循环,流程控制,函数)

Lua编程笔录--Lua初识及语法三(运算符和字符串)





Lua 数组

数组,就是相同数据类型的元素按一定顺序排列的集合,可以是一维数组和多维数组。

Lua 数组的索引键值可以使用整数表示,数组的大小不是固定的。

一维数组

一维数组是最简单的数组,其逻辑结构是线性表。一维数组可以用for循环出数组中的元素,如下实例:

array = {"Lua", "Tutorial"}for i= 0, 2 do   print(array[i])end

以上代码执行输出结果为:

nilLuaTutorial

正如你所看到的,我们可以使用整数索引来访问数组元素,如果知道的索引没有值则返回nil。

在 Lua 索引值是以 1 为起始,但你也可以指定 0 开始。




多维数组

多维数组即数组中包含数组或一维数组的索引键对应一个数组。

以下是一个三行三列的阵列多维数组:

-- 初始化数组array = {}for i=1,3 do   array[i] = {}      for j=1,3 do         array[i][j] = i*j      endend-- 访问数组for i=1,3 do   for j=1,3 do      print(array[i][j])   endend

以上代码执行输出结果为:

123246369





Lua 迭代器

迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址

在Lua中迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。



泛型 for 迭代器

泛型 for 在自己内部保存迭代函数,实际上它保存三个值:迭代函数、状态常量、控制变量。

泛型 for 迭代器提供了集合的 key/value 对,语法格式如下:

for k, v in pairs(t) do    print(k, v)end

上面代码中,k, v为变量列表;pair(t)为表达式列表。

查看以下实例:

array = {"Lua", "Tutorial"}for key,value in ipairs(array) do   print(key, value)end

以上代码执行输出结果为:

1  Lua2  Tutorial


Lua table(表)

table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数字、字典等。

Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。

Lua table 是不固定大小的,你可以根据自己需要进行扩容。

Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。 例如string.format表示使用"format"来索引table string。




table(表)的构造

构造器是创建和初始化表的表达式。表是Lua特有的功能强大的东西。最简单的构造函数是{},用来创建一个空表。可以直接初始化数组:

-- 初始化表mytable = {}-- 指定值mytable[1]= "Lua"-- 移除引用mytable = nil-- lua 垃圾回收会释放内存
当我们为 table a 并设置元素,然后将 a 赋值给 b,则 a 与 b 都指向同一个内存。如果 a 设置为 nil ,则 b 同样能访问 table 的元素。如果没有指定的变量指向a,Lua的垃圾回收机制会清理相对应的内存。

Table 操作

以下列出了 Table 操作常用的方法:

序号方法 & 用途1table.concat (table [, sep [, start [, end]]]):

concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。

2table.insert (table, [pos,] value):

在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾.

3table.maxn (table)

指定table中所有正数key值中最大的key值. 如果不存在key值为正数的元素, 则返回0。(Lua5.2之后该方法已经不存在了,本文使用了自定义函数实现)

4table.remove (table [, pos])

返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。

5table.sort (table [, comp])

对给定的table进行升序排序。




Table 连接

我们可以使用 concat() 方法来连接两个 table:

fruits = {"banana","orange","apple"}-- 返回 table 连接后的字符串print("连接后的字符串 ",table.concat(fruits))-- 指定连接字符print("连接后的字符串 ",table.concat(fruits,", "))-- 指定索引来连接 tableprint("连接后的字符串 ",table.concat(fruits,", ", 2,3))

执行以上代码输出结果为:

连接后的字符串 bananaorangeapple连接后的字符串 banana, orange, apple连接后的字符串 orange, apple

插入和移除

以下实例演示了 table 的插入和移除操作:

fruits = {"banana","orange","apple"}-- 在末尾插入table.insert(fruits,"mango")print("索引为 4 的元素为 ",fruits[4])-- 在索引为 2 的键处插入table.insert(fruits,2,"grapes")print("索引为 2 的元素为 ",fruits[2])print("最后一个元素为 ",fruits[5])table.remove(fruits)print("移除后最后一个元素为 ",fruits[5])

执行以上代码输出结果为:

索引为 4 的元素为 mango索引为 2 的元素为 grapes最后一个元素为 mango移除后最后一个元素为 nil




Table 排序

以下实例演示了 sort() 方法的使用,用于对 Table 进行排序:

fruits = {"banana","orange","apple","grapes"}print("排序前")for k,v in ipairs(fruits) doprint(k,v)endtable.sort(fruits)print("排序后")for k,v in ipairs(fruits) doprint(k,v)end

执行以上代码输出结果为:

排序前1banana2orange3apple4grapes排序后1apple2banana3grapes4orange

Table 最大值

table.maxn 在 Lua5.2 之后该方法已经不存在了,我们定义了 table_maxn 方法来实现。

以下实例演示了如何获取 table 中的最大值:

function table_maxn(t)    local mn = 0    for k, v in pairs(t) do        if mn < k then            mn = k        end    end    return mnendtbl = {[1] = "a", [2] = "b", [3] = "c", [26] = "z"}print("tbl 长度 ", #tbl)print("tbl 最大值 ", table_maxn(tbl))

执行以上代码输出结果为:

tbl 长度 3tbl 最大值 26



0 0