• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >Lua > Lua中table的遍历详解

Lua中table的遍历详解

作者:junjie 字体:[增加 减小] 来源:互联网

junjie 通过本文主要向大家介绍了Lua中table的遍历详解等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

当我在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是:
for key, value in pairs(tbtest) do 
    XXX 
end
 
for key, value in ipairs(tbtest) do 
    XXX 
end
 
for i=1, #(tbtest) do 
    XXX 
end
 
for i=1, table.maxn(tbtest) do 
    XXX 
end
</div>
前两种是泛型遍历,后两种是数值型遍历。当然你还会说lua的table遍历还有很多种方法啊,没错,不过最常见的这些遍历确实有必要弄清楚。

这四种方式各有特点,由于在工作中我几乎每天都会使用遍历table的方法,一开始也非常困惑这些方式的不同,一段时间后才渐渐明白,这里我也是把自己的一点经验告诉大家,对跟我一样的lua初学者也许有些帮助(至少当初我在写的时候在网上就找了很久,不知道是因为大牛们都认为这些很简单,不需要说,还是因为我笨,连这都要问)。

首先要明确一点,就是lua中table并非像是C/C++中的数组一样是顺序存储的,准确来说lua中的table更加像是C++中的map,通过Key对应存储Value,但是并非顺序来保存key-value对,而是使用了hash的方式,这样能够更加快速的访问key对应的value,我们也知道hash表的遍历需要使用所谓的迭代器来进行,同样,lua也有自己的迭代器,就是上面4种遍历方式中的pairs和ipairs遍历。但是lua同时提供了按照key来遍历的方式(另外两种,实质上是一种),正式因为它提供了这种按key的遍历,才造成了我一开始的困惑,我一度认为lua中关于table的遍历是按照我table定义key的顺序来的。
下面依次来讲讲四种遍历方式,首先来看for k,v in pairs(tbtest) do这种方式:
先看效果:
tbtest = { 
    [1] = 1, 
    [2] = 2, 
    [3] = 3, 
    [4] = 4, 
}
 
for key, value in pairs(tbtest) do 
    print(value) 
end
</div>
我认为输出应该是1,2,3,4,实际上的输出是1,2,4,3。我因为这个造成了一个bug,这是后话。

也就是说for k,v in pairs(tbtest) do 这样的遍历顺序并非是tbtest中table的排列顺序,而是根据tbtest中key的hash值排列的顺序来遍历的。

当然,同时lua也提供了按照key的大小顺序来遍历的,注意,是大小顺序,仍然不是key定义的顺序,这种遍历方式就是for k,v in ipairs(tbtest) do。
for k,v in ipairs(tbtest) do 这样的循环必须要求tbtest中的key为顺序的,而且必须是从1开始,ipairs只会从1开始按连续的key顺序遍历到key不连续为止。
tbtest = { 
    [1] = 1, 
    [2] = 2, 
    [3] = 3, 
    [5] = 5, 
}
 
for k,v in ipairs(tbtest) do 
    print(v) 
end
</div>
只会打印1,2,3。而5则不会显示。
local tbtest = { 
    [2] = 2, 
    [3] = 3, 
    [5] = 5, 
}
 
for k,v in ipairs(tbtest) do 
    print(v) 
end
</div>
这样就一个都不会打印。
 
第三种遍历方式有一种神奇的符号'#',这个符号的作用是是获取table的长度,比如:
tbtest = { 
    [1] = 1, 
    [2] = 2, 
    [3] = 3, 
} 
print(#(tbtest))
</div>
打印的就是3
tbtest = { 
    [1] = 1, 
    [2] = 2, 
    [6] = 6, 
} 
print(#(tbtest))
</div>
这样打印的就是2,而且和table内的定义顺序没有关系,无论你是否先定义的key为6的值,‘#'都会查找key为1的值开始。
如果table的定义是这样的:
tbtest = { 
    ["a"] = 1, 
    [2] = 2, 
    [3] = 3, 
}
 
print(#(tbtest))
</div>
那么打印的就是0了。因为‘#'没有找到key为1的值。同样:
tbtest = { 
    [“a”] = 1, 
    [“b”] = 2, 
    [“c”] = 3, 
} 
print(#(tbtest))
</div>
打印的也是0
所以,for i=1, #(tbtest) do这种遍历,只能遍历当tbtest中存在key为1的value时才会出现结果,而且是按照key从1开始依次递增1的顺序来遍历,找到一个递增不是1的时候就结束不再遍历,无论后面是否仍然是顺序的key,比如:

table.maxn获取的只针对整数的key,字符串的key是没办法获取到的,比如:
tbtest = { 
    [1] = 1, 
    [2] = 2, 
    [3] = 3, 
} 
print(table.maxn(tbtest))
 
 
tbtest = { 
    [6] = 6, 
    [1] = 1, 
    [2] = 2, 
} 
print(table.maxn(tbtest))
</div>
这样打印的就是3和6,而且和table内的定义顺序没有关系,无论你是否先定义的key为6的值,table.maxn都会获取整数型key中的最大值。
如果table的定义是这样的:
tbtest = { 
    ["a"] = 1, 
    [2] = 2, 
    [3] = 3, 
} 
print(table.maxn(tbtest))
</div>
那么打印的就是3了。如果table是:

您可能想查找下面的文章:

相关文章

  • Lua和C++的通信流程分解
  • Lua中函数的几个特别之处探究
  • linux系统安装Nginx Lua环境
  • Lua协同程序(COROUTINE)运行步骤分解
  • Lua编程示例(二):面向对象、metatable对表进行扩展
  • Lua table的concat方法使用实例
  • Lua教程(一):简介、优势和应用场景介绍
  • 深入解读Lua中迭代器与泛型for的使用
  • Lua教程(一):Lua脚本语言介绍
  • 在Mac OS中安装Lua的教程

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Lua读取和写入文件处理例子
    • Lua所有内置函数罗列
    • Lua编程示例(三):稀疏表、双端队列、格式化输出、表和循环表的格式化输出
    • Lua教程(十九):C调用Lua
    • Lua table中安全移除元素的方法
    • Lua中的弱引用介绍
    • Lua中的协同程序探究
    • Lua中的函数精讲笔记
    • Lua模块和模块载入浅析
    • Lua函数与字符串处理简明总结

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有