以游戏排序需求为例,假如有个表,每个成员含有上次退出游戏时间(在线为-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.对于被排序的表中没有的变量,可以根据条件在排序前进行构造后,再进行排序。