在Lua中对多维表进行排序

时间:2014-08-20 06:43:21

标签: sorting lua lua-table

“如何在Lua中对表格进行排序”问题并不新鲜,但我发现的答案无法帮助我,也许你可以。

我得到了这张表:

table       = {} -- some kind of database
table[1]    = {table.containing.table.with.even.more.tables.inside}
table[9]    = {table.containing.table.with.even.more.tables.inside}
table[13]   = {table.containing.table.with.even.more.tables.inside}
table[15]   = {table.containing.table.with.even.more.tables.inside}
table[45]   = {table.containing.table.with.even.more.tables.inside}
table[3254] = {table.containing.table.with.even.more.tables.inside}

现在我想遍历“table”,检查它包含的指定boolean,如果是,请运行带有某些子表的参数的方法。

for key, value in pairs(table) do
    print(key)
end

类似于:

9    13   1   3254    45    15

据我所知,那是因为Lua遍历哈希值(对吧?)。

我的想法是:

sorted_table = {} -- shall point to table, with sorted keys

for i = 0, #table do  -- from 0 to the last key of table (some write #table is the last key, some write it's the number of contained keys, I don't know. If you do, please tell me.)
    if table[i] then -- for runs every number from i to #table, if i is a key, bingo.
        table.insert(sorted_table,(table[i])) -- first key found -> sorted_table[1], second -> sorted_table[2]....
    end
end

for k,v in pairs(sorted_table) do
    print(key)
end

我没有错误,它只是跳过函数而没有任何反应。当我打印#table时,它会打印0#table在另一个文件中,但它不是本地的,而是在函数文件的其他位置使用,所以,...这很奇怪。

修改 嗯怪。我抛出了一些调试,#table是nil,但是在代码下的一对(表)中,一切正常。

**SOLUTION-EDIT**

local sorted_table = {}
for k, v in pairs(original_table) do
    table.insert(sorted_table, k)
end
table.sort(sorted_table)
for k, v in ipairs(sorted_table) do
    print(original_table[v])
end

2 个答案:

答案 0 :(得分:3)

尝试一点解释:

#table不一定返回表的长度。如果在没有特殊键的表中添加,则表元素将获取默认键。这些键从1开始,然后上升到n。如果两个键之间存在间隙,当您提供自己的键时,#table将在该间隙之前返回键。 例如:

t = {'one', 'two', 'three'} -- would be a table like 1 - one, 2 - two, 3 - three
print(#t) -- the last key -> 3, here it works
t2 = {'one', 'two', [4] = 'four'} -- would be a table like 1 - one, 2 - two, 4 - four
print(#t2) -- the last key without a gap -> 2, does not work

与对(表)和ipairs(表)相同。 ipairs从key 1迭代到n没有间隙,对迭代遍历所有键。这就是解决方案有效的原因。 您可以为表(__len)设置自己的元方法,以便将#用于正确的长度。

请记住,默认情况下,您的表键从1开始。 希望在这里解决问题有点帮助。

答案 1 :(得分:2)

<强>解

local sorted_table = {}
for k, v in pairs(original_table) do
    table.insert(sorted_table, k)
end
table.sort(sorted_table)
for k, v in ipairs(sorted_table) do
    print(original_table[v])
end