对包含表格的表进行排序

我可以使用以下代码根据两个信息(名称和第二个信息,如年龄)对表进行排序:

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”。但是现在我想再往前迈一步。

我能否请这里的一个编程大师帮我?非常感谢大家的帮助!谢谢!

点赞
用户2633423
用户2633423

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

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通用(它假定被迭代的表具有给定的结构),但如果你的应用程序经常需要处理类似于t的表,则这不是问题。

2013-10-03 19:46:11