問題標籤:測試
Lua Table 迭代器;Lua Table 輸出順序; Lua Table 順序輸出;Lua Table 數字索引 字符串索引;Lua Table pairs;lua
問題背景:spa
使用pairs輸出table時,其輸出順序與一般認知不相符.code
例如使用pairs輸出以下tableblog
T = { [1] = "1", [2] = "1", [3] = "1", [4] = "1", [5] = "1", [10] = "1", [20] = "1", [30] = "1", [40] = "1", [50] = "1", [11] = "1", [12] = "1", [13] = "1", q = "1", [14] = "1", w = "1", [15] = "1", e = "1", r = "1", t = "1", y = "1", } for k,v in pairs(T) do print(k) end
咱們一般認爲:輸出結果會是先順序輸出12345,再亂序輸出其它索引
可是恰巧 在lua 5.1.5 都是亂序字符串
經測試在lua 5.1.5,若是想與一般認爲相符,那麼就不能顯示指定索引值,只能隱式指定索引值,就是把上述table改爲這樣:string
T = { "1", "1", "1", "1", "1", [10] = "1", [20] = "1", [30] = "1", [40] = "1", [50] = "1", [11] = "1", [12] = "1", [13] = "1", q = "1", [14] = "1", w = "1", [15] = "1", e = "1", r = "1", t = "1", y = "1", }
可是這種解決辦法,顯然讓人沒法接受,讓人窒息.因此今天研究了一下解決辦法io
目標:table
使用迭代器輸出Table時,首先順序輸出數字索引(容許數字索引間斷),最後輸出字符串索引
問題解決:
靈感來源於<Programming In Lua>中的代碼:
function pairsByKeys(t) local a = {} for n in pairs(t) do a[#a + 1] = n end table.sort(a) local i = 0 return function() i = i + 1 return a[i], t[a[i]] end end for key, value in pairsByKeys(表) do end
可是這個還差點意思,當table中包含字符串索引時,會報錯.咱們指望能和pairs同樣兼容字符串索引.咱們強化一下,以下:
function spairs(t) local num_key_table = {} local string_key_table = {} for k,v in pairs(t) do if type(k) == "number" then num_key_table[#num_key_table + 1] = k else string_key_table[k] = v end end table.sort(num_key_table) local i = 0 return function() if i < #num_key_table then i = i + 1 return num_key_table[i], t[num_key_table[i]] else for k,v in pairs(string_key_table) do string_key_table[k] = nil return k,v end end end end for k,v in spairs(T) do print(k) end
對比:
還有改進的地方,歡迎指導