在用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(" [%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(" [%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)