【问题标题】:Lua: iterate table (with alphanumeric values) on two specific columnsLua:在两个特定列上迭代表(带有字母数字值)
【发布时间】:2021-01-16 08:35:14
【问题描述】:

我有这段代码迭代 Lua 表“childrenTable”以检索其值,但我希望它们按列 “symbolicname” 排序然后,按列“名称”

  • 此示例中的表格内容是插入的,但在我的实际场景中它们是自动填充的,因此我无法控制它们如何进入表格。我将在此处插入内容只是为了填充表格:

    local JSON = require 'dkjson'

    local childrenTable = {}
    
    childrenTable[1] = {symbolicname = "02 CONNECTOR", path = "system/core/b connector", name = "b connector"}
    childrenTable[2] = {symbolicname = "02 CONNECTOR", path = "system/core/a connector", name = "a connector"}
    childrenTable[3] = {symbolicname = "01 CORE", path = "/system/core/b", name = "b"}

    childrenTable[4] = {symbolicname = "01 CORE", path = "/system/core/a", name = "a"}    
        
    for index,value in ipairs(childrenTable) do print(JSON.encode(value)) end

现在正在返回这个结果:

{"name":"b connector","symbolicname":"02
CONNECTOR","path":"system/core/b connector"}

{"name":"a connector","symbolicname":"02
CONNECTOR","path":"system/core/a connector"}

{"name":"b","symbolicname":"01 CORE","path":"/system/core/b"}

{"name":"a","symbolicname":"01 CORE","path":"/system/core/a"}

但我希望它按顺序返回列表:

{"name":"a","symbolicname":"01 CORE","path":"/system/core/a"}

{"name":"b","symbolicname":"01 CORE","path":"/system/core/b"}

{"name":"a connector","symbolicname":"02
CONNECTOR","path":"system/core/a connector"}

{"name":"b connector","symbolicname":"02
CONNECTOR","path":"system/core/b connector"}

提前致谢,

罗杰

【问题讨论】:

    标签: sorting lua lua-table


    【解决方案1】:

    使用table.sort 函数,它将遍历表格并在当前索引的左右翼向您传递一个项目。 (table.sort基于快速排序算法)

    这对你有用:

    local childrenTable = {}
    childrenTable[1] = {symbolicname = "02 CONNECTOR", path = "system/core/b connector", name = "b connector"}
    childrenTable[2] = {symbolicname = "02 CONNECTOR", path = "system/core/a connector", name = "a connector"}
    childrenTable[3] = {symbolicname = "01 CORE", path = "/system/core/b", name = "b"}
    childrenTable[4] = {symbolicname = "01 CORE", path = "/system/core/a", name = "a"} 
    
    table.sort(childrenTable, function(a, b)
        if a.symbolicname < b.symbolicname then
            return true
        else
            if a.name < b.name then
                return true
            else return false end
        end
        return false
    end)
    
    for k,v in pairs(childrenTable) do print(k, v.name, v.symbolicname) end
    

    此外,对于大量数据,请考虑使用数据框。

    【讨论】:

    • 您的排序函数包含错误(如果a.symbolicname &gt; b.symbolicnamea.name &lt; b.name 怎么办?它应该返回false 但将返回true)并且可以简化:return a.symbolicname &lt; b.symbolicname or a.symbolicname == b.symbolicname and a.name &lt; b.name
    • 工作就像一个魅力,感谢@Alexander Mashin(你的修复没问题)和 Coal,也感谢 luther 的更正!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多