2013-10-03 64 views
1

我可以与两件的信息(姓名和一个第二片,例如年龄)用下面的代码进行排序的表:排序一个表包含表格

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。但是现在我想再走一步。

我可以从这里的编程大师获得一些帮助吗?!这是非常感谢家伙!谢谢!

回答

2

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

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的表,那么这不是问题。

+0

谢谢。但是,我怎样才能将键设置为“年龄”而不必物理地操作? (由于某种原因,我似乎无法回复你,@洛伦佐·多纳蒂?) – Pwrcdr87

+0

@洛伦佐·多纳蒂克。我刚刚意识到我没有'local timer = os.time()重复,直到os.time()> timer + 10'结束。有用!谢谢! – Pwrcdr87