【问题标题】:Table keys not sorting correctly表键未正确排序
【发布时间】:2021-03-10 23:19:39
【问题描述】:

我有一张像这样的表

{
   ["slot1"] = {}
   ["slot2"] = {}
   ["slot3"] = {}
   ["slot4"] = {}
   ["slot5"] = {}
   ["slot6"] = {}
}

当我执行 for k, v in pairs 循环时,我希望密钥从 slot1- 最后一个 slot。在我执行循环时,顺序不一致,插槽 5 排在第一位,等等。最好的方法是什么?

这张桌子也不是我设计的,我无法改变按键的外观

【问题讨论】:

  • 真正的键是否真的匹配相同的格式somename#
  • 是的,"slot" 然后是后面的数字

标签: sorting lua


【解决方案1】:

你可以编写一个简单的自定义迭代器:

local tbl = {
   ["slot1"] = {},
   ["slot2"] = {},
   ["slot3"] = {},
   ["slot4"] = {},
   ["slot5"] = {},
   ["slot6"] = {}
}

function slots(tbl)
    local i = 0
    return function()
        i = i + 1
        if tbl["slot" .. i] ~= nil then
            return i, tbl["slot" .. i]
        end
    end
end

for i, element in slots(tbl) do
    print(i, element)
end

输出:

1   table: 0xd575f0
2   table: 0xd57720
3   table: 0xd57760
4   table: 0xd5aa40
5   table: 0xd5aa80
6   table: 0xd5aac0

【讨论】:

    【解决方案2】:

    创建一个新表:

    slot = {}
    for k,v in pairs(original_table) do
      local i=tonumber(k:match("%d+$"))
      slot[i]=v
    end
    

    【讨论】:

      【解决方案3】:

      Lua 表的顺序是不确定的。看这里what makes lua tables key order be undeterministic

      对于你的桌子,你可以试试这个

      local t = {
         ["slot1"] = {},
         ["slot2"] = {},
         ["slot3"] = {},
         ["slot4"] = {},
         ["slot5"] = {},
         ["slot6"] = {}
      }
      
      local slotNumber = 1
      while(t['slot' .. slotNumber]) do
         slot = t['slot' .. slotNumber]
         -- do stuff with slot
      
         slotNumber = slotNumber + 1
      end
      

      如果表跳过一个槽号,此方法不处理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-13
        • 1970-01-01
        相关资源
        最近更新 更多