2014-07-12 17 views
1

我得到了下面的表格设置:如何在表格中循环并保持顺序?

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 

正如你所看到的,为了完全搞砸向上。 如何在表格上循环并保持订单?

回答

3

你劳动一种误解下:
的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 
3

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

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

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