如何循环遍历表格并保持顺序?
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 并保持顺序和最大并发?