chapter11_1 Lua数组、列表

  Lua中的table可以表示其他语言提供的数据结构:数组、记录、线性表、队列、集合等。

在Lua中很少编写搜索算法,因为table本身就提供了直接访问任意类型的功能。

数组

  使用整数来索引table即可在lua中实现数组,数组没有固定大小,可以根据需要增长。

通常,在初始化一个数组时,也就间接地定义了它的大小:

a = {}  --新建一个数组
for i = 1,1000 do
    a[i] = 0
end

长度操作符(#)依赖于这个事实来计算数组的大小:

print(#a)    --> 1000

可以使用0,1或其他任意值来作为数组的起始索引:

--使用索引值 -5 ~ 5来创建一个数组
a = {}
for i=-5,5 do
    a[i] = 0
end

在Lua中的习惯一般是以1作为数组的起始索引。Lua库和长度操作符都遵循这个约定。

如果你的数组不是从1开始,那就无法使用这些功能。

通过table构造式,可以在一句表达式中创建并初始化数组:

squares = {1,4,7,16,25,49,62,87}

这种构造式可以根据要求变得更长。

矩阵与多维数组

  在Lua中,有两种方式表示矩阵。

第一种是使用一个“数组的数组”,也就是说一个table中的每个元素是另一个table。

创建一个NxM的零矩阵:

mt = {}                --创建矩阵
for i = 1,N do
    mt[i] = {}         --创建一个新行
    for j=1,M do
        mt[i][j] = 0
    end
end    

由于在Lua中table是一种对象,因此在创建矩阵时,必须显式地创建每一行。

第二种是将两个索引合并为一个索引。如果两个索引是整数,可以将第一个索引乘以一个适当的常量,并加上第二个索引。

mt = {}
for i = 1,N do
    for j = 1,M do
        mt[(i-1)* M + j] = 0
    end
end

如果索引是字符串,那么可以把索引拼接起来,中间使用一个字符来分隔。例如,使用字符串s和t来索引一个矩阵,可以通过代码m[s..":"..t],其中,s和t都不

能包含冒号,否则像("a:",":b")这样的索引会使最终索引变成“a::b”。如果无法保证这点,可以使用例如“\0”这样的控制字符来分隔两个索引。

关于“稀疏矩阵”这里就不讨论了。

 

posted @ 2016-09-01 11:28  daiker  阅读(505)  评论(0编辑  收藏  举报