對於lua的table排序問題,通常的按照value值來排序,使用table.sort( needSortTable , func)便可(能夠根據本身的須要重寫func,不然會根據默認來:默認的情形之下,若是表內既有string,number類型,則會由於兩個類型直接compare而出錯,因此須要本身寫func來轉換一下;也可根據本身的須要在此func中 添加相應的邏輯來達到你的 排序要求);html
local test_table = {2,1,3,"SORT","sort"} table.sort(test_table , function(a , b) return tostring(a) > tostring(b) end) for key,value in pairs(test_table) do print(key,value) end -- 輸出以下: 1 sort 2 SORT 3 3 4 2 5 1
若要進行對錶進行按照 鍵值對key值來進行排序,只是輸入的話,目測能夠這樣:數組
local test_table = {a=3,b=2,c=4,d=1} local key_table = {} --取出全部的鍵 for key,_ in pairs(test_table) do table.insert(key_table,key) end --對全部鍵進行排序 table.sort(key_table) for _,key in pairs(key_table) do print(key,test_table[key]) end
可是這樣子僅僅可以使得print輸入時達到這個目的,而table自己並無所以而改變,因此這樣是不可取的; 咱們能夠改變泛型for的迭代因子來達到這個目的的:閉包
function ipairs2(a) return iter,a,0 end local function iter(a, i) i = i + 1 local v = a[i] if v then return i, v else return nil, nil end end a = {"one","two","three"} for k,v in ipairs2(a) do print(k, v) end --輸出結果爲: --1 one --2 two --3 three
如此是達到咱們的目的了,可是這個只能支持下表爲整形的table(便是 放在table數組部分的表,hash部分卻未能爲力);因此須要相似這樣子:lua
lines = { name = "jeff", {"pairsByKeys"}, luaH_set = 10, luaH_get = 24, luaH_present = 48, } function pairsByKeys(t, f) local a = {} for n in pairs(t) do table.insert(a, n) end table.sort(a, f) local i = 0 -- iterator variable local iter = function () -- iterator function i = i + 1 if a[i] == nil then return nil else return a[i], t[a[i]] end end return iter end function sortFunc(a , b) if tostring(a) > tostring(b) then return true end end for name, line in pairsByKeys(lines , sortFunc) do print(name, line) end
輸出地結果以下:spa
name jeff luaH_set 10 luaH_present 48 luaH_get 24 1 table: 027EE6E8 [Finished in 0.1s]
如此這般 便可實現表按照鍵值對的排序了;這樣的實現方式其實與上述將table的索引存入一個temp表中,並將此temp表按func排序;只不過這裏 使用閉包,將此處理放置在了一個方法內來替代pairs罷了;code
關於泛型for的文章,可參看這邊文章:Click Here htm
參考Bolg : Click Hereblog