Lua使用table.sort实现多条件排序实例解析精华

以游戏排序需求为例,假如有个表,每个成员含有上次退出游戏时间(在线为-1),战斗力,等级3个变量。

排序需求:1.在线优先于离线 2.战力高优先于战力低 3.等级高优先于等级低 4.离线短优先于离线长

现通过lua table库中的table.sort来实现此需求。

Lua5.3参考手册关于table.sort官方描述:

table.sort()

  • 原型:table.sort (table [, comp])
  • 解释:对一个长度为length=n的数组table排序,也就是对tab_table[1]到tab_table[n]排序,如果参数comp不省略,则它必须是一个函数,可以接收表tab_table的两个元素,并且在第一个元素小于第二个元素时返回true,其他情况返回false,如果省略参数comp,则Lua彼岸准运算符operator <将会被使用。

代码实例:

local player = {}
player[1] = {lastLogout = os.time()-5001, power = 20000, level = 40}
player[2] = {lastLogout = os.time()-3000, power = 90000, level = 90}
player[3] = {lastLogout = os.time()-5000, power = 20000, level = 40}
player[4] = {lastLogout = -1,             power = 70000, level = 40}
player[5] = {lastLogout = os.time()-4000, power = 90000, level = 80}
--加入在线/离线变量
for k,v in pairs(player) do
    if v.lastLogout == -1 then
        v.online = 1
    else
        v.online = 0
    end
end
print("******************* before sort *******************")
for k, v in ipairs(player) do  print(k,"online:"..v.online,"power:"..v.power,"level:"..v.level,"offlineTime:"..v.lastLogout)
end
table.sort(player, function(a, b)        
    --在线>离线
    if a.online  ~= b.online then
        return a.online > b.online
    --战力高>战力低
    elseif a.power ~= b.power then
        return a.power > b.power
    --等级高>等级低
    elseif a.level ~= b.level then
        return a.level > b.level
    --离线短>离线长
    elseif a.lastLogout ~= b.lastLogout then
        return a.lastLogout > b.lastLogout
    end
end)
print("******************* after sort *******************")
for k, v in ipairs(player) do    print(k,"online:"..v.online,"power:"..v.power,"level:"..v.level,"offlineTime:"..v.lastLogout)
end

从排序结果来看满足了1.在线优先于离线 2.战力高优先于战力低 3.等级高优先于等级低 4.离线短优先于离线长

这样的多条件需求。

对于第一个条件在线优先于离线,需要构造出一个新的字段,根据离线时间的值保存在线/离线状态,这是这类需求的通用做法。

table.sort使用总结:

1.降序大于号,升序小于号

2.不要使用>=和<=符号

3.对于多条件排序可用选择结构(if elseif)来处理

4.对于被排序的表中没有的变量,可以根据条件在排序前进行构造后,再进行排序。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ellis1970

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值