当我在工作中利用lua进行开发时,发此刻lua中有4种方式遍历一个table,固然,从本质上来讲其实都一样,只是形式不同,这四种方式别离是:
1for key, value in pairs(tbtest) do
2XXX
3end
4
5for key, value in ipairs(tbtest) do
6XXX
7end
8
9for i=1, #(tbtest) do
10 XXX
11end
12
13for i=1, table.maxn(tbtest) do
14 XXX
15end
前两种是泛型遍历,后两种是数值型遍历。固然你还会说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这种方式:
先看成效:
16tbtest = {
17 [1] = 1,
18 [2] = 2,
19 [3] = 3,
20 [4] = 4,
21}
22
23for key, value in pairs(tbtest) do
24 print(value)
25end
我以为输出应该是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不持续为止。
26tbtest = {
27[1] = 1,
28[2] = 2,
29[3] = 3,
30[5] = 5,
31}
32
33for k,v in ipairs(tbtest) do
34print(v)
35end
只会打印1,2,3。而5那么可不能显示。
36local tbtest = {
37[2] = 2,
38[3] = 3,
39[5] = 5,
40}
41
42for k,v in ipairs(tbtest) do
43print(v)
44end
如此就一个都可不能打印。
第三种遍历方式有一种神奇的符号'#',那个符号的作用是是获取table的长度,比如:45tbtest = {
46[1] = 1,
47[2] = 2,
48[3] = 3,
49}
50print(#(tbtest))
打印的确实是3
51tbtest = {
52[1] = 1,
53[2] = 2,
54[6] = 6,
55}
56print(#(tbtest))
如此打印的确实是2,而且和table内的概念顺序没有关系,不管你是不是先概念的key为6的值,‘#’都会查key为1的值开始。
若是table的概念是如此的:
57tbtest = {
58["a"] = 1,
59[2] = 2,
60[3] = 3,
61}
62
63print(#(tbtest))
那么打印的确实是0了。因为‘#’没有到key为1的值。一样:
64tbtest = {
65[“a”] = 1,
66[“b”] = 2,
67[“c”] = 3,
68}
69print(#(tbtest))
打印的也是0
因此,for i=1, #(tbtest) do这种遍历,只能遍历当tbtest中存在key为1的value时才会显现结果,而且是依照key从1开始依次递增1的顺序来遍历,到一个递增不是1的时候就终止再也不遍历,不管后面是不是仍然是顺序的key,比如:
table.maxn获取的只针对整数的key,字符串的key是没方法获取到的,比如:70tbtest = {
71[1] = 1,
72[2] = 2,
73[3] = 3,
74}
75print(table.maxn(tbtest))
76
77
78tbtest = {
79[6] = 6,
80[1] = 1,
81[2] = 2,
82}
83print(table.maxn(tbtest))
如此打印的确实是3和6,而且和table内的概念顺序没有关系,不管你是不是先概念的key 为6的值,table.maxn都会获取整数型key中的最大值。
若是table的概念是如此的:
84tbtest = {
85["a"] = 1,
86[2] = 2,
87[3] = 3,
88}
89print(table.maxn(tbtest))
那么打印的确实是3了。若是table是:
90tbtest = {
91[“a”] = 1,
92[“b”] = 2,
93[“c”] = 3,
94}
95print(table.maxn(tbtest))
lua字符串转数组96print(#(tbtest))
那么打印的就全数是0了。
换句话说,事实上因为lua中table的构造表达式超级灵活,在同一个table中,你能够随
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论