- 2
- 0
- 约6.96千字
- 约 10页
- 2016-08-21 发布于湖北
- 举报
Lua中table的遍历
当我在工作中使用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?
前两种是泛型遍历,后两种是数值型遍历。当然你还会说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?
我认为输出应该是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?
只会打印1,2,3。而5则不会显示。
local?tbtest?=?{??
[2]?=?2,??
[3]?=?3,??
[5]?=?5,??
}?
?
for?k,v?in?ipairs(tbtest)?do??
print(v)??
end?
这样就一个都不会打印。
?
第三种遍历方式有一种神奇的符号#,这个符号的作用是是获取table的长度,比如:
tbtest?=?{??
[1]?=?1,??
[2]?=?2,??
[3]?=?3,??
}??
print(#(tbtest))?
打印的就是3
tbtest?=?{??
[1]?=?1,??
[2]?=?2,??
[6]?=?6,??
}??
print(#(tbtest))?
这样打印的就是2,而且和table内的定义顺序没有关系,无论你是否先定义的key为6的值,‘#’都会查找key为1的值开始。
如果table的定义是这样的:
tbtest?=?{??
[a]?=?1,??
[2]?=?2,??
[3]?=?3,??
}?
?
print(#(tbtest))?
那么打印的就是0了。因为‘#’没有找
您可能关注的文档
- L20新概念第三册.pptx
- L17-PPT.ppt
- L214B_Anticoagulation 1_ch.ppt
- 人教版二年级下期12.北京亮起来了资料.ppt
- 青海湖_梦幻般的湖9资料.ppt
- 人教版二年级语文第二单元资料.doc
- 青海湖_梦幻般的湖简洁课件资料.ppt
- L6562制作PFC充电器.ppt
- L6灰岩水疏水降压孔与观测孔施工方案.docx
- 青海湖_梦幻般的湖资料.ppt
- 2025年全国演出经纪人员资格认定考试试卷带答案(研优卷).docx
- 2025年全国演出经纪人员资格认定考试试卷完整版.docx
- 2025年全国演出经纪人员资格认定考试试题库及完整答案.docx
- 2025年全国演出经纪人员资格认定考试试卷完美版.docx
- 2025年全国演出经纪人员资格认定考试试卷含答案(实用).docx
- 2025年全国演出经纪人员资格认定考试试卷及答案(各地真题).docx
- 2025年下半年内江市部分事业单位公开考试招聘工作人员(240人)备考题库附答案.docx
- 2025年全国演出经纪人员资格认定考试试卷及答案1套.docx
- 2025年下半年四川成都市郫都区面向社会引进公共类事业单位人员2人备考题库最新.docx
- 2025年下半年内江市部分事业单位公开考试招聘工作人员(240人)备考题库附答案.docx
原创力文档

文档评论(0)