lua中,in pairs的循环的顺序问题

lua中,in pairs的循环的顺序问题,第1张

用pairs就是没顺序,随机的,跟k的哈希值有点关系。
t={1,2,3,4,5,6,7,8,9}--必须是这样的table,元素必须要要用tableinsert插入,用ipairs遍历,这种table相当于t[1]=1,t[2]=2t[9]=9,如果后面有个t[11]=11,那么用ipairs就遍历不到。原因是table里面分两部分,数组和hash表,t[1],t[2]等连续的是相当于数组部分,不连续的索引都放hash表里了,顺序不一定。
str = ""
for i,v in ipairs(t) do
str = strv","
end
print(str)

tablesort的功能是把
{300,100,200}排序成 {100, 200, 300}
也就是把
{[1]=300, [2]=100, [3]=200} 排序成 {[1]=100, [2]=200 [3]=300}
但是你的b确是
{[1]=1, [2]=2, [5]=1, [6]=1, [7]=4, [8]=2, [9]=3}
这样 [3]=nil, [4]=nil
当sort遇到[3]=nil就认为数组结束了, 就出错了,
你必须给 [3]=0, [4]=0才行,
即是这样, 排序后数据就变了,
你这里不是对一个数排序, 是对一对数排序,
修改如下:
a={7,8,9,7,8,9,7,7,9,6,5,2,2,1}
b={}
for i=1,#a do
b[a[i]] = (b[a[i]] or 0)+1
end
--把统计结果做成数组
c = {}
n = 0
for k,v in pairs(b) do
n = n + 1
c[n] = {k,v}
end
cmp = function(x,y)
if x==nil then return true end;
if y==nil then return false end;
return ((x[2] < y[2]) or ((x[2] == y[2]) and (x[1] < y[1])) )
end
tablesort(c, cmp)
for i=1, #c do
print(c[i][1]":"c[i][2]"\n");
end

-->函数
-->1无参无返回值

-->2无参有返回值

-->3有参无返回值

-->4有参有返回值

-->演示:函数作为参数传递给函数

-->演示2:0000000

---->练习1:比较俩个数的大小,返回最大的数

---->练习2:利用可变参数列表,使用任意一种循环求和值

---->向下取整

--> 数组
--> 这里需要注意lua中的数组是从1开始的,当然你也可以

--> 自定义下标

--> 练习1:找出数组中最大的值

--> 二维数组

--> 演示泛型迭代器

Lua中遍历table主要有四种方式,各有各的不同

Lua的存储并不是顺序存储的,所以当我们使用第一种遍历方法去遍历的时候,输出的值可能和我们想象的顺序不同。

在我们的设想里,我们是希望它输出1,2,3,4,但是实际上输出的是1,2,4,3。for k,v in ipairs(tbtest) do是根据key中的hash值的排列顺序来排列的。

它的前提是key是从1开始的,那么它会按照key的大小顺序进行遍历,如果key不连续,它就不会接下去遍历

上面的函数只会打印1,2,3不会打印5

这样就一个都不会遍历

因为#table 是获取table里的数组段的长度,遍历时只会输出数组段的值,并且它的前提也是key必须从1开始,如果key不从1开始,#tbtest获取到的值就是0

它获取的是数组段的key的最大值,字符串的key是无法获取到的

其实maxn还是很有用处的,用它取到最大的key值,我们就可以从前往后遍历数据了,完全可以略过nil

while循环与其他语言循环几乎相同。

repeatuntil在lua51之后和其他语言有一些细微的不同,就是在循环体的局部变量的作用域扩增到条件测试中,也就是until语句。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13349016.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-19
下一篇 2023-07-19

发表评论

登录后才能评论

评论列表(0条)

保存