lua中,in pairs的循环的顺序问题
t={a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8,i=9}str=""fori,vinpairs(t)dostr=str..v..","endprin...
t = {a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8,i=9}
str = ""
for i,v in pairs(t) do
str = str..v..","
end
print(str)
输出是
1,3,2,5,4,7,6,9,8,
怎么才能让他输出1,2,3,4,5,6,7,8,9,啊?主要是我希望他输出的列顺序与原表中的列顺序相同
额..这已经是简化版本了,这是一个二维或者三维的table,因为多个数组使用的是一个函数来进行数组输出的功能,所以输出的函数中包含有获取元素中的列名的功能。可是输出之后就是每行数据都是这样的效果。
function player_tab_create(player_tab,number) --建立player表
for i = 1,number,1 do
table.insert(player_tab,{id = table.getn(player_tab)+1 ,w_times = 0 ,l_times = 0 ,w_weight = 1,pexp = 0,bexp = 0,lv = 1,groupid = 1})
end
return player_tab
end
function out_tab(tab,lnlist) --输出二维数组
local temp = {}
for _,sub in pairs(tab) do --获得列名
for k,v in pairs(sub) do
temp[k] = 1
end
end
if lnlist ~= nil then
temp = lnlist
end
local str
for i = 1, table.getn(tab), 1 do
str = ""
for k,v in pairs(temp) do
if tab[i][k] == nil then
the_vaule = -1
else
the_vaule = tab[i][k]
str = str..k.." =\t "..the_vaule..",\t"
end
end
out(str)
end
end 展开
str = ""
for i,v in pairs(t) do
str = str..v..","
end
print(str)
输出是
1,3,2,5,4,7,6,9,8,
怎么才能让他输出1,2,3,4,5,6,7,8,9,啊?主要是我希望他输出的列顺序与原表中的列顺序相同
额..这已经是简化版本了,这是一个二维或者三维的table,因为多个数组使用的是一个函数来进行数组输出的功能,所以输出的函数中包含有获取元素中的列名的功能。可是输出之后就是每行数据都是这样的效果。
function player_tab_create(player_tab,number) --建立player表
for i = 1,number,1 do
table.insert(player_tab,{id = table.getn(player_tab)+1 ,w_times = 0 ,l_times = 0 ,w_weight = 1,pexp = 0,bexp = 0,lv = 1,groupid = 1})
end
return player_tab
end
function out_tab(tab,lnlist) --输出二维数组
local temp = {}
for _,sub in pairs(tab) do --获得列名
for k,v in pairs(sub) do
temp[k] = 1
end
end
if lnlist ~= nil then
temp = lnlist
end
local str
for i = 1, table.getn(tab), 1 do
str = ""
for k,v in pairs(temp) do
if tab[i][k] == nil then
the_vaule = -1
else
the_vaule = tab[i][k]
str = str..k.." =\t "..the_vaule..",\t"
end
end
out(str)
end
end 展开
2个回答
展开全部
用pairs就是没顺序,随机的,跟k的哈希值有点关系。
t={1,2,3,4,5,6,7,8,9}--必须是这样的table,元素必须要要用table.insert插入,用ipairs遍历,这种table相当于t[1]=1,t[2]=2...t[9]=9,如果后面有个t[11]=11,那么用ipairs就遍历不到。原因是table里面分两部分,数组和hash表,t[1],t[2]等连续的是相当于数组部分,不连续的索引都放hash表里了,顺序不一定。
str = ""
for i,v in ipairs(t) do
str = str..v..","
end
print(str)
t={1,2,3,4,5,6,7,8,9}--必须是这样的table,元素必须要要用table.insert插入,用ipairs遍历,这种table相当于t[1]=1,t[2]=2...t[9]=9,如果后面有个t[11]=11,那么用ipairs就遍历不到。原因是table里面分两部分,数组和hash表,t[1],t[2]等连续的是相当于数组部分,不连续的索引都放hash表里了,顺序不一定。
str = ""
for i,v in ipairs(t) do
str = str..v..","
end
print(str)
追问
谢谢回答,是这样的,我现在的问题是要保持列名的顺序,里面的值很有可能是没有顺序的,所以直接按值排序是不行的,代码我放在了问题补充了,麻烦在看下呗...
-------借个地方,问题补充放不下了-------
在输出了本来想用lnlist来存放一个数组来存放输出顺序,可是in pairs输出的还是无序的
追答
用下面这个
function out_tab(tab,lnlist) --输出二维数组
local keys = lnlist or {}
if lnlist == nil then
local temp = {}
for _,sub in pairs(tab) do --获得列名
for k,v in pairs(sub) do
temp[k] = 1
end
end
for k,v in pairs(temp) do
table.insert(keys,k)
end
end
local str
for i = 1, table.getn(tab), 1 do
str = ""
for _,key in ipairs(keys) do
if tab[i][key] == nil then
the_vaule = -1
else
the_vaule = tab[i][key]
str = str..key.." =\t "..the_vaule..",\t"
end
end
out(str)
end
end
--------------------------------------
--这么调用
t = {}
player_tab_create(t,10)
out_tab(t,{"id","w_times","l_times","w_weight","pexp","bexp","lv","groupid"})
展开全部
正如楼上所说的
只有按照从1开始的自然数排列的表才能按顺序输出 否则就没办法了
所以我们这里要创建一个表,用来做key的排序,再根据这个表输出原来的顺序
key = {}
for i in pairs(t) do
table.insert(key,i)
end
table.sort(key)
for i,v in ipairs(key) do
print(t[v])
end
-----------以上是按照key的顺序排列------------
如果要按照值的排列的话 一个道理
key = {}
for i in pairs(t) do
table.insert(key,i)
end
table.sort(key,function(v1,v2) return t[v1] < t[v2] end)
for i,v in ipairs(key) do
print(t[v])
end
不过 如果按照你给的例子来说 按值排列和按key排列是看不出结果的差异
只有按照从1开始的自然数排列的表才能按顺序输出 否则就没办法了
所以我们这里要创建一个表,用来做key的排序,再根据这个表输出原来的顺序
key = {}
for i in pairs(t) do
table.insert(key,i)
end
table.sort(key)
for i,v in ipairs(key) do
print(t[v])
end
-----------以上是按照key的顺序排列------------
如果要按照值的排列的话 一个道理
key = {}
for i in pairs(t) do
table.insert(key,i)
end
table.sort(key,function(v1,v2) return t[v1] < t[v2] end)
for i,v in ipairs(key) do
print(t[v])
end
不过 如果按照你给的例子来说 按值排列和按key排列是看不出结果的差异
追问
谢谢回答,是这样的,我现在的问题是要保持列名的顺序,里面的值很有可能是没有顺序的,所以直接按值排序是不行的,代码我放在了问题补充了,麻烦在看下呗...
按key排序的话也不成,因为key也不是有序的...而且因为多维的关系,用key输出的时候可能也会有问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询