Lua之table(表)

简介:

Lua table(表)

使用表来统一表示Lua中的一切数据,是Lua区分于其他语言的一个特色。这个特色从最开始的Lua版本保持至今,很大的原因是为了在设计上保持简洁。Lua表分为数组和散列表部分,其中数组部分不像其他语言那样,从0开始作为第一个索引,而是从1开始。散列表部分可以存储任何其他不能存放在数组部分的数据,唯一的要求就是键值不能为nil。尽管内部实现上区分了这两个部分,但是对使用者而言却是透明的。使用Lua表,可以模拟出其他各种数据结构——数组、链表、树等。

虽然设计上简洁,并且对使用者更加透明、友好,但是如果使用不当,还会造成效率性能上的差异。

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

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

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

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

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

======================================================

序号 方法 & 用途
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的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
-- 简单的table
mytable = {}
print( "mytable 的类型是 : " , type(mytable))
 
mytable[1] =  "Lua"
mytable[ "wow" ] =  "修改前"
 
print( "mytable 索引为1 的元素是 : " , mytable[1])
print( "mytable 索引为wow 的元素是 : " , mytable[ "wow" ])
 
--alternatable和mytable的是指向同一个table
alternatable = mytable
 
print( "alternatable 索引为1 的元素是 : " , alternatable[1])
print( "alternatable 索引为wow 的元素是 : " , alternatable[ "wow" ])
 
alternatable[ "wow" ] =  "修改后"
 
print( "mytable 索引为wow 的元素是 : " , mytable[ "wow" ])
 
-- 释放变量
alternatable = nil
print( "alternatable 是  " , alternatable)
 
-- mytable仍然可以访问
print( "mytable 索引为wow 的元素是 : " , mytable[ "wow" ])
 
mytable = nil;
 
print( "mytable 是 "  , mytable);

运行结果:

wKioL1mo4-rxvpfmAAC0H2uoaTE476.jpg-wh_50

=========================================================================

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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])

运行结果:

wKiom1mo8FGh8dTXAAB3d3wQfoM958.jpg-wh_50

=======================================================================

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
 
tb1 = {[1] =  "a" ,[2] =  "b" ,[3] =  "c" ,[26] =  "z" ,}
print( "tb1 长度 : " , #tb1)
print( "tb1最大值 : " , table_maxn(tb1))

运行结果:

wKiom1mo8xCDb3icAABcbugeYNU511.jpg-wh_50


后记:

Lua 元表(Metatable)

在 Lua table 中我们可以访问对应的key来得到value值,但是却无法对两个 table 进行操作。



因此 Lua 提供了元表(Metatable),允许我们改变table的行为,每个行为关联了对应的元方法。


本文转自 liam2199 博客,原文链接:     http://blog.51cto.com/liam2199/1961897      如需转载请自行联系原作者

相关文章
|
5月前
|
存储 Java C语言
lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】
lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】
43 0
|
XML Java 数据格式
【Lua基础 第2章】lua遍历table的方式、运算符、math库、字符串操作方法
lua遍历table的方式、运算符、math库、字符串操作方法
566 0
【Lua基础 第2章】lua遍历table的方式、运算符、math库、字符串操作方法
|
12月前
|
C# 数据库
Lua Table转C# Dictionary
Lua Table转C# Dictionary
86 0
|
Java 索引
Lua语言——table(表)
Lua语言——table(表)
127 0
|
XML Java 数据格式
【Lua基础 第4章】Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
117 0
【Lua基础 第4章】Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
|
数据采集 存储 JavaScript
Lua 语法 Table 与模块|学习笔记
快速学习 Lua 语法 Table 与模块
157 0
Lua 语法 Table 与模块|学习笔记
Lua Table表实现字典
Lua Table表实现字典
675 0
Lua Table表实现字典
|
存储 应用服务中间件