【问题标题】:How to loop through the table and keep the order?如何循环遍历表格并保持顺序?
【发布时间】:2014-09-03 01:18:18
【问题描述】:

我得到了下表:

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

如您所见,订单完全混乱。 如何循环遍历表格并保持顺序?

【问题讨论】:

    标签: loops lua lua-table


    【解决方案1】:

    你在一个误解下工作:
    Lua 表明确不保留输入元素的顺序,因此无法在事后引用该顺序。
    (实际上,它们目前是数组和哈希映射的混合体)

    您可能真正想要的(按照您提供的示例)是迭代按键排序的元素。
    这当然是可能的,但需要自定义迭代器。

    迭代器的工作原理:
    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
    

    【讨论】:

      【解决方案2】:

      你不能直接。您必须构建一个不同的表结构,最好从一开始就这样做:

      local a = {
          { seconds = 12 * 30 * 24 * 60 * 60, name  =  'year'},
          ...
      }
      

      那么,假设您不添加或删除任何元素,则表格的数组部分将是一个序列。对于序列,可以使用#length 运算符或ipairs 进行迭代。

      【讨论】:

        猜你喜欢
        • 2021-12-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 2016-04-01
        • 1970-01-01
        相关资源
        最近更新 更多