如何循环表并保持订单?

时间:2014-07-12 15:09:15

标签: loops lua lua-table

我得到了下表:

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

正如您所看到的,订单完全搞砸了。 如何循环查看表并保持订单?

2 个答案:

答案 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进行迭代。