有没有办法以类似于下面的表格的方式循环播放一个表格?
local tbl = {
["hello"] = 1,
[2] = 2,
[50] = 3,
["bye"] = 4,
[200] = 5
}
我的意思是,当我“成对”使用时,每次执行代码时我都会得到不同的顺序......
我正在寻找类似的东西:
function get_keys(tbl)
local rtable = {}
for k,v in pairs(tbl) do
table.insert(rtable, k)
end
return rtable
end
local keys_of_tbl = get_keys(tbl)
for i = 1, table.getn(keys_of_tbl) do
--Do something with: tbl[keys_of_tbl[i]]
end
但是因为函数“get_keys”再次基于“成对”,它将无法工作......
答案 0 :(得分:6)
没有。没有"如源中所写"订购表。 (考虑到并非所有的密钥都必然存在于源代码中。)lua没有"概念的顺序"对于非连续的整数键。
如果您想要特定订单,您可以通过某种方式手动保留该订单。
如果您的表中没有任何整数键,那么您可以将它们用作您的订单(并使用ipairs
循环这些键并将值索引为获取实际值的键)
如果原始值是您要排序的顺序,那么您可以循环和反向映射以获得一个表,您可以在完成后使用ipairs
进行迭代。
答案 1 :(得分:5)
在Lua中,未指定对遍历键的顺序。但是,您可以保存在数组样式表中添加项的顺序,并使用ipairs
(它具有在数组中迭代键的已定义顺序)。为此,您可以使用元表创建自己的有序表,以便在添加新密钥时保持密钥顺序。
编辑(早期代码在更新时插入了多个密钥副本)
要执行此操作,您可以使用我们被调用的__newindex
,只要索引尚未添加到表中即可。 ordered_add
方法在隐藏表_keys
和_values
中更新,删除或存储密钥。请注意,我们在更新密钥时也会始终调用__newindex
,因为我们没有将值存储在表中,而是将其存储在“隐藏”表_keys
和_values
中。
但请注意,我们无法使用此表中的任何键,键名"_keys"
将覆盖我们的隐藏表,因此更安全的替代方法是使用ordered_table.insert(t, key, value)
ordered_table.index(t, key)
和{{1方法。
ordered_table.remove(t, key)
答案 2 :(得分:0)
我的一个朋友给了我这个小功能,它也很好用:
function switch_key_val(tbl)
local rtbl = {}
for k,v in pairs(tbl) do
rtbl[v] = k
end
return rtbl
end
可以这样使用:
local tbl = {
["hello"] = 1,
[2] = 2,
[50] = 3,
["bye"] = 4,
[200] = 5
}
local tbl = switch_key_val(tbl)
for v,k in pairs(tbl) do
print(k,v)
end
每次执行我的代码时都会给我相同的结果