如何循环遍历表格并保持顺序?

Posted

技术标签:

【中文标题】如何循环遍历表格并保持顺序?【英文标题】: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

如您所见,订单完全混乱。

【问题讨论】:

【参考方案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 进行迭代。

【讨论】:

以上是关于如何循环遍历表格并保持顺序?的主要内容,如果未能解决你的问题,请参考以下文章

在一个语句中查找无序数组中的最大(或最小)元素,同时保持顺序[重复]

php如何复制文件和子文件夹中的文件到指定目录,保持路径顺序不变

如何合并多个 observables 并保持顺序和最大并发?

如何从 Python 列表中删除重复项并保持顺序? [复制]

我们如何在电子表格公式中更改列值并保持行不变?

如何在 Hive 中对文件进行重复数据删除并保持原始排序顺序?