Lua多重排序

网上有好多排序,不过写的都大同小异。本文讲解下多重排序,意思是多个条件排序。
前提:
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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值