對于lua的table排序問題,一般的按照value值來排序,使用table.sort( needSortTable , func)即可(可以根據自己的需要重寫func,否則會根據預設來:預設的情形之下,如果表内既有string,number類型,則會因為兩個類型直接compare而出錯,是以需要自己寫func來轉換一下;也可根據自己的需要在此func中 添加相應的邏輯來達到你的 排序要求);
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部分卻未能為力);是以需要類似這樣子:
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
輸出地結果如下:
name jeff
luaH_set 10
luaH_present 48
luaH_get 24
1 table: 027EE6E8
[Finished in 0.1s]
如此這般 即可實作表按照鍵值對的排序了;這樣的實作方式其實與上述将table的索引存入一個temp表中,并将此temp表按func排序;隻不過這裡 使用閉包,将此處理放置在了一個方法内來替代pairs罷了;
關于泛型for的文章,可參看這邊文章:
Click Here參考Bolg :
Click Here