2010-01-19 47 views

回答

3

你可以連續的整數鍵唯一排序表從1開始,即列表。如果你有鍵值對的另一個表,你可以對列表和排序是:

function sortpairs(t, lt) 
    local u = { } 
    for k, v in pairs(t) do table.insert(u, { key = k, value = v }) end 
    table.sort(u, lt) 
    return u 
end 

當然,這是有益的,只有您提供自定義排序(lt),它預計作爲參數鍵/值對。

這個問題在一個related question about sorting Lua tables在更大的長度討論。

+0

使您無論是說就沒有辦法進行排序的自定義(即字符串)鍵的表???我真的很喜歡Lua,因爲這種靈活的語言,但即使蹩腳的Java或(最好的語言)C#可以做到這一點。 – mnn

+1

帶有字符串鍵的Lua表* *不是*排序的。如果您想要訂購一組鍵值對,則可以更改該表示。 –

+0

但後來,我無法從中獲得一個項目,因爲我要保存表項的整數索引。並且該索引將在刪除條目後發生變化... – mnn

2

因爲他們首先沒有任何順序。這就像試圖分類一個裝滿香蕉的垃圾袋。

+0

其實,我覺得它更像是試圖挑選一個揹包滿蘋果核 –

6

一般來說,Lua表是純關聯數組。除了作爲Lua核心中使用的特定哈希表實現的副作用之外,沒有「自然」順序。這是有道理的,因爲任何Lua數據類型(nil除外)的值都可以用作鍵和值;但只有字符串和數字有任何一種明智的排序,然後只在相似類型的值之間。

例如,又該此表的排序順序是:

unsortable = { 
    answer=42, 
    true="Beauty", 
    [function() return 17 end] = function() return 42 end, 
    [math.pi] = "pi", 
    [ {} ] = {}, 
    12, 11, 10, 9, 8 
} 

它有一個字符串鍵,一個布爾鍵,一個功能鍵,一個非整數鍵,一個表鍵,五整數鍵。函數應該排在字符串之前嗎?你如何比較字符串與數字?表格應該在哪裏排序?那麼userdatathread值不會出現在這張表中?

按照慣例,以1開頭的順序整數索引的值通常用作列表。一些功能和常用習語遵循這個慣例,table.sort就是一個例子。對列表進行操作的函數通常會忽略存儲在不屬於列表的鍵處的任何值。再次,table.sort就是一個例子:它僅對那些存儲在列表中的鍵的元素進行排序。

另一個例子是#運營商。對於上表,#unsortable爲5,因爲unsortable[5] ~= nilunsortable[6] == nil。請注意,即使pi在3和4之間,數值索引math.pi中存儲的值也不會被計數,因爲它不是整數。此外,其他非整數鍵都不會被統計。這意味着,簡單的for循環可以遍歷整個列表:

for i in 1,#unsortable do 
    print(i,unsortable[i]) 
end 

雖然經常被寫爲

for i,v in ipairs(unsortable) do 
    print(i,v) 
end 

總之,Lua中的表是值的無序集合,各由一個鍵索引;但對於連續整數鍵在1

編輯開頭的特殊約定:對於非整體按鍵與合適的部分排序的特殊情況下,有一個變通涉及到一個單獨的索引表。所描述的以字符串值爲關鍵字的表格內容是這個技巧的一個合適的例子。

首先,以列表的形式收集新表中的密鑰。也就是說,建立一個由連續整數索引的表,從1開始,用鍵作爲值並對其進行排序。然後,使用該索引按照所需順序遍歷原始表。

例如,這裏是foreachinorder(),它使用此技術遍歷表的所有值,並按比較函數確定的順序調用每個鍵/值對的函數。

function foreachinorder(t, f, cmp) 
    -- first extract a list of the keys from t 
    local keys = {} 
    for k,_ in pairs(t) do 
     keys[#keys+1] = k 
    end 
    -- sort the keys according to the function cmp. If cmp 
    -- is omitted, table.sort() defaults to the < operator 
    table.sort(keys,cmp) 
    -- finally, loop over the keys in sorted order, and operate 
    -- on elements of t 
    for _,k in ipairs(keys) do 
     f(k,t[k]) 
    end 
end 

它構建的指數,與table.sort()排序,然後遍歷的排序索引的每個元素,並要求每一個功能f。函數f傳遞了鍵和值。排序順序由傳遞給table.sort的可選比較函數確定。這就是所謂的兩個元素進行比較(在這種情況下,密鑰表t)和必須返回true如果第一個小於第二個。如果省略,table.sort使用內置<運營商。

例如,下表給出:

t1 = { 
    a = 1, 
    b = 2, 
    c = 3, 
} 

然後foreachinorder(t1,print)打印:

 
a 1 
b 2 
c 3 

foreachinorder(t1,print,function(a,b) return a>b end)打印:

 
c 3 
b 2 
a 1 
+0

OK的,我怎麼能那麼排序呢?畢竟我想提供我自己的比較功能,所以我不知道爲什麼它不能完成。所有表格元素都具有相同的模式:鍵是一個字符串,值是另一個表。 – mnn

+0

請參閱我的編輯示例使用第二個表進行排序。 – RBerteig

相關問題