“如何在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
答案 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