2014-10-02 388 views
2

我已經經歷了很多問題和Google結果,但找不到解決方案。通過鍵排序Lua表

我想在Lua中使用table.sort函數對錶格進行排序,但我無法弄清楚如何使用它。

我有一個表中有鍵作爲隨機數字值。我想按升序對它們進行排序。我也瀏覽了Lua維基頁面,但table.sort只適用於表格值。

t = { [223]="asd", [23]="fgh", [543]="hjk", [7]="qwe" } 

我想它想:

t = { [7]="qwe", [23]="fgh", [223]="asd", [543]="hjk" } 
+1

你真的想解決什麼問題? – lhf 2014-10-02 12:12:06

+1

你給的代碼是不正確的Lua代碼... – lhf 2014-10-02 12:12:47

+0

是的,我寫錯了對不便帶來的歉意。 – 2014-10-02 12:30:37

回答

3

有在Lua表無秩序的概念:它們只是設置鍵值對的。

下面兩個表具有完全相同的內容,因爲它們包含完全相同的對:

t = { [223] = "asd" ,[23] = "fgh",[543]="hjk",[7]="qwe"} 
t = {[7]="qwe",[23] = "fgh",[223] = "asd" ,[543]="hjk"} 
+0

你是對的,但我們可以設置鍵升序,因爲當我比較這兩個表時,它會出現不同,因爲當我比較第一個鍵值對將是t [223]和[7]。表在升序,然後我可以很容易地找到丟失的鍵。 – 2014-10-02 12:26:21

+2

該手冊[說](http://www.lua.org/manual/5.2/manual.html#pdf-next):「索引枚舉的順序沒有指定,即使對於數字索引。」它甚至可能從程序的一次運行改變到另一次運行。 – lhf 2014-10-02 12:37:02

1

什麼被@lhf說的是真的,你的LUA表保存它的內容可以以任意順序執行找到可行。但是,如果您想以打印方式打印(或遍歷它),則可能(因此您可以逐個比較它)。要做到這一點,您可以通過以下方式

for key, value in orderedPairs(mytable) do 
    print(string.format("%s:%s", key, value)) 
end 

不幸的是這樣做,orderedPairs不作爲LUA的一部分提供,您可以從here複製的實施雖然。

6

您無法使用pairs設置從哈希(這是您的表格)中檢索元素的順序。你需要從該表中的按鍵,按鍵作爲自己的表進行排序,然後使用這些排序鍵從原來的表中檢索值:

local t = { [223]="asd", [23]="fgh", [543]="hjk", [7]="qwe" } 
local tkeys = {} 
-- populate the table that holds the keys 
for k in pairs(t) do table.insert(tkeys, k) end 
-- sort the keys 
table.sort(tkeys) 
-- use the keys to retrieve the values in the sorted order 
for _, k in ipairs(tkeys) do print(k, t[k]) end 

這將打印

7 qwe 
23 fgh 
223 asd 
543 hjk 

另一種選擇是提供自己的迭代器而不是pairs以按需要的順序迭代表,但按鍵的排序可能足夠簡單以滿足您的需要。