网上有好多排序,不过写的都大同小异。本文讲解下多重排序,意思是多个条件排序。
前提:
1.Lua排序的原理是冒泡排序,即从前往后比较,满足一定条件A则交换,否则不交换。
2.Lua排序函数table.sort(tbl, sortFunc), sortFunc中会比较前后表中前后两个值,sortFunc函数返回true则不交换,返回false则交换。
例子:
table_demo = {
[1] = {
creat_time = 11,
quality = 1,
sum = 4,
},
[2] = {
creat_time = 12,
quality = 1,
sum = 2,
},
[3] = {
creat_time = 13,
quality = 1,
sum = 1,
},
[4] = {
creat_time = 14,
quality = 1,
sum = 5,
},
[5] = {
creat_time = 15,
quality = 1,
sum = 7,
},
}
目标:将table_demo 按照sum从小到大排序, 若sum大小相等则按照quality从小到大排序, 如果quality一样大,则按create_time从小到大排序(ps: create_time大小设置是都不同的)。
代码如下:
function sortFunc(a, b)
if a.sum == b.sum then
if a.quality == b.quality then
return a.creat_time < b.creat_time
else
return a.quality < b.quality
end
else
return a.sum < b.sum
end
end
table.sort(table_demo, sortFunc)
for k=1, 5 do
print("-----", k, table_demo[k].creat_time, table_demo[k].quality, table_demo[k].sum)
end
结果:
—– 1 13 1 1
—– 2 12 1 2
—– 3 11 1 4
—– 4 14 1 5
—– 5 15 1 7
note:
多重排序的个性案例, 根据present_person_num == 10排序,两类再根据quality 排序。
function SelectRoomView:SortRoomList(room_list_old)
local SortFunc = function (a, b)
local time1 = 0
local time2 = 0
if a.msg_banquet_room_info.present_person_num == 10 then
time1 = 1
end
if b.msg_banquet_room_info.present_person_num == 10 then
time2 = 1
end
if a.msg_banquet_room_info.present_person_num == b.msg_banquet_room_info.present_person_num then
if a.msg_banquet_room_info.quality == b.msg_banquet_room_info.quality then
return a.msg_banquet_room_info.create_time > b.msg_banquet_room_info.create_time
else
return a.msg_banquet_room_info.quality > b.msg_banquet_room_info.quality
end
elseif a.msg_banquet_room_info.present_person_num < b.msg_banquet_room_info.present_person_num then
if time2 == 0 then
if a.msg_banquet_room_info.quality == b.msg_banquet_room_info.quality then
return a.msg_banquet_room_info.create_time > b.msg_banquet_room_info.create_time
else
return a.msg_banquet_room_info.quality > b.msg_banquet_room_info.quality
end
else
return true
end
else
return false
end
end
local room_list_new = room_list_old
table.sort(room_list_new, SortFunc)
return room_list_new
end