2013-10-03 81 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