在用table.sort 排序的時候注意,如果使用多個條件排序,應在一個排序函數里按照條件優先級進行比較排序。
例如
local t = { {time = 2, i = 1}, {time = 5, i = 2}, {time = 0, i = 2}, {time = 3, i = 4}, {time = 1, i = 5}, {time = 4, i = 2}, }
現要求按 i 排序,i 相同時按 time 排序,
假如用兩次排序
1、先用time排序
table.sort(t, function(t1, t2) return t1.time > t2.time end) print("t = {") for i, v in ipairs(t) do print(string.format("\t[%d] = {time = %d, i = %d}", i, v.time, v.i)) end print("}")
排序后結果:
t = { [1] = {time = 5, i = 2} [2] = {time = 4, i = 2} [3] = {time = 3, i = 4} [4] = {time = 2, i = 1} [5] = {time = 1, i = 5} [6] = {time = 0, i = 2} }
此時再按 i 排序
table.sort(t, function(t1, t2) return t1.i > t2.i end) print("t = {") for i, v in ipairs(t) do print(string.format("\t[%d] = {time = %d, i = %d}", i, v.time, v.i)) end print("}")
期望 i 相等時(i = 2)能得到和按 time 排序后的一樣的相對位置,即:
t = { [1] = {time = 1, i = 5} [2] = {time = 3, i = 4} [3] = {time = 5, i = 2} [4] = {time = 4, i = 2} [5] = {time = 0, i = 2} [6] = {time = 2, i = 1} }
然而實際結果卻是:
t = { [1] = {time = 1, i = 5} [2] = {time = 3, i = 4} [3] = {time = 5, i = 2} [4] = {time = 0, i = 2} [5] = {time = 4, i = 2} [6] = {time = 2, i = 1} }
這應該是table.sort的內部排序算法造成的。
所以,在多個條件下排序需要一個排序函數,只調用table.sort()一次。而且多次排序也影響性能。
table.sort(t, function(t1, t2) if t1.i == t2.i then return t1.time > t2.time else return t1.i > t2.i end end)