【问题标题】:Sorting a Table Containing Tables对包含表的表进行排序
【发布时间】:2013-10-04 09:03:16
【问题描述】:

我可以使用以下代码对包含两条信息(名称和第二条,例如年龄)的表格进行排序:

t = {
Steve = 4,
Derek = 1,
Mike = 5,
Steph = 10,
Mary = 7,
Danny = 2
}

function pairsByKeys (t,f)  
    local a = {}

    for x in pairs (t) do
        a[#a + 1] = x
    end

    table.sort(a,f)
    local i = 0
    return function ()
    i = i + 1
    return a[i], t[a[i]]
    end
end

for a,t in pairsByKeys (t) do
    print (a,t)
end

结果:

Danny   2
Derek   1
Mary    7
Mike    5
Steph   10
Steve   4

我有一个场景,按照惯例,每个人的姓名标签都包含一个条形码。此条码在扫描时会将每个人的四条信息输入到表格数据库中。该数据库由以下部分组成:

t = {
    {name = "Mike", addr = "738 Rose Rd", age = 30, phone = "333-902-6543"}
    {name = "Steph", addr = "1010 Mustang Dr", age = 28, phone = "555-842-0606"}
    {name = "George", addr = "211 Glass St", age = 34, phone = "111-294-9903"}
}

但是如何更改我的代码以按年龄对所有四个条目(姓名、地址、年龄、电话)进行排序并保持所有变量彼此一致?

我一直在尝试进行实验,并掌握了按pairs 对表格进行排序的窍门,并且对如何执行table.sort 有了更好的了解。但现在我想再迈出这一步。

我可以从这里的一位编程大师那里获得一些帮助吗?!非常感谢你们!谢谢!

【问题讨论】:

    标签: sorting lua lua-table


    【解决方案1】:

    您可以使用年龄作为表格的键:

    t = {
        [30] = {name = "Mike", addr = "738 Rose Rd", age = 30, phone = "333-902-6543"},
        [28] = {name = "Steph", addr = "1010 Mustang Dr", age = 28, phone = "555-842-0606"},
        [34] = {name = "George", addr = "211 Glass St", age = 34, phone = "111-294-9903"},
    }
    
    function pairsByKeys (t,f)
        local a = {}
    
        for x in pairs (t) do
            a[#a + 1] = x
        end
    
        table.sort(a,f)
        local i = 0
        return function ()
            i = i + 1
            return a[i], t[a[i]]
        end
    end
    
    
    for a,t in pairsByKeys (t) do
        print (t.name, t.addr, t.age, t.phone)
    end
    

    编辑

    否则,如果你不想改变t的结构,你可以改变你的迭代器生成函数来跟踪索引:

    t = {
        {name = "Mike", addr = "738 Rose Rd", age = 30, phone = "333-902-6543"},
        {name = "Steph", addr = "1010 Mustang Dr", age = 28, phone = "555-842-0606"},
        {name = "George", addr = "211 Glass St", age = 34, phone = "111-294-9903"},
    }
    
    function pairsByAgeField(t,f)
        local a = {}
        local index = {}
    
        for _, x in pairs(t) do
            local age = x.age
            a[#a + 1] = age
            index[age] = x
        end
    
        table.sort(a,f)
        local i = 0
        return function ()
            i = i + 1
            return a[i], index[a[i]]
        end
    end
    
    
    for a,t in pairsByAgeField(t) do
        print (t.name, t.addr, t.age, t.phone)
    end
    

    当然,这使得pairsByAgeField 的适用性不如原来的pairsByKeys(它假定被迭代的表具有给定的结构),但如果您经常需要处理诸如@ 之类的表,这不是问题987654326@ 在您的应用程序中。

    【讨论】:

    • 谢谢。但是我如何将密钥设置为等于age 而无需实际操作? (出于某种原因,我似乎无法回复你,@Lorenzo Donati?)
    • @LorenzoDonatiOk。我刚刚意识到我最后没有local timer = os.time() repeat until os.time() > timer + 10。有用!谢谢!
    猜你喜欢
    • 2012-07-07
    • 2015-04-06
    • 2010-10-29
    • 1970-01-01
    • 2015-08-24
    • 2020-09-09
    • 1970-01-01
    • 2021-10-31
    • 2013-04-29
    相关资源
    最近更新 更多