lua 二维数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua 二维数组相关的知识,希望对你有一定的参考价值。

table =

x = 10.3, 10.3, 15.0, -44.3,....,
y = 98.5, 18.3, 98.5, 323.1,....


希望得到x1=10.3,y1=98.5 依次类推

table.x[1] -> 10.3
table.y[y] -> 98.5
以此类推

提示一下,希望楼主以后遇到能轻松应付。
table是一个lua表(容器),
x,y是表中的一个属性,所以访问他们要用点,即“.”
x,y本身是数组,因此需要用下表来访问。即 "x[1],x[2] ... y[1], y[2]..."

所以 要访问表中的数组 格式为 表.数组名[下标]
参考技术A 希望是什么意思?

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

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

用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)追问

谢谢回答,是这样的,我现在的问题是要保持列名的顺序,里面的值很有可能是没有顺序的,所以直接按值排序是不行的,代码我放在了问题补充了,麻烦在看下呗...
-------借个地方,问题补充放不下了-------
在输出了本来想用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")

参考技术A 正如楼上所说的
只有按照从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输出的时候可能也会有问题

以上是关于lua 二维数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 Lua 表作为二维数组

Lua学习十----------Lua数组

如何在 Lua 中的二维表上创建迭代器?

C 语言数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )

C 语言二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )

JAVA中如何创建一个二维数组,然后给二维数组赋值!