我得到了下表:
local a = {
[12 * 30 * 24 * 60 * 60] = 'year',
[30 * 24 * 60 * 60] = 'month',
[24 * 60 * 60] = 'day',
[60 * 60] = 'hour',
[60] = 'minute',
[1] = 'second'
}
然而,当我对它进行循环并打印键时,我得到了这个值:
for seconds, str in pairs(a) do
print (seconds, str)
end
----------
31104000 year
60 minute
3600 hour
1 second
2592000 month
86400 day
正如您所看到的,订单完全搞砸了。 如何循环查看表并保持订单?
答案 0 :(得分:4)
你是在误解下工作:
Lua表明确地不保留输入元素的顺序,因此事后没有办法引用该顺序。
(在引擎盖下,它们目前是数组和散列图的混合体)
您可能真正想要的(按照您提供的示例),正在迭代按键排序的元素 这当然是可能的,但需要一个自定义的iteratorator。
迭代器如何工作:
what is actual implementation of lua __pairs?
Difference between stateful and stateless iterators in Lua
function sorted_iter(t)
local i = {}
for k in next, t do
table.insert(i, k)
end
table.sort(i)
return function()
local k = table.remove(i)
if k ~= nil then
return k, t[k]
end
end
end
因此,您的循环变为:
for seconds, str in sorted_iter(a) do
print (seconds, str)
end
答案 1 :(得分:4)
你不能直接。您必须构建一个不同的表结构,您可以从一开始就这样做:
local a = {
{ seconds = 12 * 30 * 24 * 60 * 60, name = 'year'},
...
}
然后,假设您不添加或删除任何元素,表的数组部分将是一个序列。对于序列,您可以使用#length运算符或ipairs
进行迭代。