Lua成对使用与编写的

时间:2015-06-21 22:40:26

标签: loops lua lua-table

有没有办法以类似于下面的表格的方式循环播放一个表格?

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”再次基于“成对”,它将无法工作......

3 个答案:

答案 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

每次执行我的代码时都会给我相同的结果