lua 12 table 的使用

「爱情、让人受尽委屈。」 2023-08-17 15:17 158阅读 0赞

转自:http://www.runoob.com/lua/lua-tables.html

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

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

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

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


table(表)的构造

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

  1. -- 初始化表
  2. mytable = {}
  3. -- 指定值
  4. mytable[1]= "Lua"
  5. -- 移除引用
  6. mytable = nil
  7. -- lua 垃圾回收会释放内存

  

当我们为 table a 并设置元素,然后将 a 赋值给 b,则 a 与 b 都指向同一个内存。如果 a 设置为 nil ,则 b 同样能访问 table 的元素。如果没有指定的变量指向a,Lua的垃圾回收机制会清理相对应的内存。

以下实例演示了以上的描述情况:

  1. -- 简单的 table
  2. mytable = {}
  3. print("mytable 的类型是 ",type(mytable))
  4. mytable[1]= "Lua"
  5. mytable["wow"] = "修改前"
  6. print("mytable 索引为 1 的元素是 ", mytable[1])
  7. print("mytable 索引为 wow 的元素是 ", mytable["wow"])
  8. -- alternatetablemytable的是指同一个 table
  9. alternatetable = mytable
  10. print("alternatetable 索引为 1 的元素是 ", alternatetable[1])
  11. print("mytable 索引为 wow 的元素是 ", alternatetable["wow"])
  12. alternatetable["wow"] = "修改后"
  13. print("mytable 索引为 wow 的元素是 ", mytable["wow"])
  14. -- 释放变量
  15. alternatetable = nil
  16. print("alternatetable 是 ", alternatetable)
  17. -- mytable 仍然可以访问
  18. print("mytable 索引为 wow 的元素是 ", mytable["wow"])
  19. mytable = nil
  20. print("mytable 是 ", mytable)

  

以上代码执行结果为:

  1. mytable 的类型是 table
  2. mytable 索引为 1 的元素是 Lua
  3. mytable 索引为 wow 的元素是 修改前
  4. alternatetable 索引为 1 的元素是 Lua
  5. mytable 索引为 wow 的元素是 修改前
  6. mytable 索引为 wow 的元素是 修改后
  7. alternatetable nil
  8. mytable 索引为 wow 的元素是 修改后
  9. mytable nil

  


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:

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

  

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

  1. 连接后的字符串 bananaorangeapple
  2. 连接后的字符串 banana, orange, apple
  3. 连接后的字符串 orange, apple

  

插入和移除

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

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

  

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

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

  

Table 排序

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

  1. fruits = {"banana","orange","apple","grapes"}
  2. print("排序前")
  3. for k,v in ipairs(fruits) do
  4. print(k,v)
  5. end
  6. table.sort(fruits)
  7. print("排序后")
  8. for k,v in ipairs(fruits) do
  9. print(k,v)
  10. end

  

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

  1. 排序前
  2. 1 banana
  3. 2 orange
  4. 3 apple
  5. 4 grapes
  6. 排序后
  7. 1 apple
  8. 2 banana
  9. 3 grapes
  10. 4 orange

  

Table 最大值

table.maxn 在 Lua5.2 之后该方法已经不存在了(在5.3中依然还有的),我们定义了 table_maxn 方法来实现。

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

  1. function table_maxn(t)
  2. local mn=nil;
  3. for k, v in pairs(t) do
  4. if(mn==nil) then
  5. mn=v
  6. end
  7. if mn < v then
  8. mn = v
  9. end
  10. end
  11. return mn
  12. end
  13. tbl = {[1] = 2, [2] = 6, [3] = 34, [26] =5}
  14. print("tbl 最大值:", table_maxn(tbl))
  15. print("tbl 长度 ", #tbl)

  

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

  1. tbl 最大值: 34
  2. tbl 长度 3

  

注意:

当我们获取 table 的长度的时候无论是使用 # 还是 table.getn 其都会在索引中断的地方停止计数,而导致无法正确取得 table 的长度。

可以使用以下方法来代替:

  1. function table_leng(t)
  2. local leng=0
  3. for k, v in pairs(t) do
  4. leng=leng+1
  5. end
  6. return leng;
  7. end

  

转载于:https://www.cnblogs.com/alexYuin/p/9955141.html

发表评论

表情:
评论列表 (有 0 条评论,158人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Lua Table函数库

    一部分的table函数只对其数组部分产生影响, 而另一部分则对整个table均产生影响. 下面会分开说明.  table.concat(table, sep,  sta

    相关 lua-table

    table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数字、字典等。 Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能

    相关 Lua学习笔记--table

    Lua只有一种数据结构,叫table。但是他灰常强大,足以满足我们一般的要求,而且可以根据table做出其他的效果。 一.简介 table类型实际上是一种关联数组,是一