源战役客户端
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 

249 行
5.1 KiB

SortTools = {}
--[[
从小到大排序的算子(用于表项)
@para2 sort_key_name 需要比较的表项中的key
--]]
function SortTools.KeyLowerSorter(sort_key_name)
return function(a, b)
if a[sort_key_name] < b[sort_key_name] then
return true
else
return false
end
end
end
--[[
从大到小排序的算子(用于表项)
@para2 sort_key_name 需要比较的表项中的key
--]]
function SortTools.KeyUpperSorter(sort_key_name)
return function(a, b)
if a[sort_key_name] > b[sort_key_name] then
return true
else
return false
end
end
end
--[[
多条件排序支持混排
@param tbl 要排序的table
@param arg 需要比较的表项中的多个key,
跟key对应的排序方式(升序:Array.UPPER还是降序:Array.LOWER)
@传参格式:arg = {{key1,key2,...},{Array.UPPER,Array.LOWER,...}}
不填写排序方式默认为升序Array.UPPER
@author jkz
@create 12/18/2013
--]]
function SortTools.MoreKeysSorter(tbl, ...)
local arg = {...}
local func = nil
--参数为空的时候直接对表项排序--
if arg == nil or #arg == 0 then
func = SortTools.ItemUpperSorter()
end
local argName = arg[1]
local argType = arg[2]
local sort_func = nil
if argName == nil then
func = SortTools.ItemUpperSorter()
--参数为单个的时候调用单个排序函数--
elseif type(argName) ~= "table" or #argName <= 1 then
if argType == nil or argType == Array.UPPER then
func = SortTools.KeyUpperSorter(argName)
else
func = SortTools.KeyLowerSorter(argName)
end
end
--多参数排序方法--
func = function(a, b)
local len = #argName
local i = 1
while len > 0 do
if argType == nil or argType[i] == nil or argType[i] == Array.UPPER then
if a[argName[i]] > b[argName[i]] then
return true
elseif a[argName[i]] ~= b[argName[i]] then
return false
end
else
if a[argName[i]] < b[argName[i]] then
return true
elseif a[argName[i]] ~= b[argName[i]] then
return false
end
end
len = len - 1
i = i + 1
end
return false
end
table.sort(tbl, func)
end
--[[
从小到大排序的算子(用于普通项)
--]]
function SortTools.ItemLowerSorter()
return function(a, b)
return a < b
end
end
--[[
从大到小排序的算子(用于普通项)
--]]
function SortTools.ItemUpperSorter()
return function(a, b)
return a > b
end
end
function SortTools.BinaryInsert(t, value, fcomp)
-- Initialise compare function
fcomp = fcomp or SortTools.ItemLowerSorter
-- Initialise numbers
local istart, iend, imid, istate = 1, #t, 1, 0
-- Get insert position
while istart <= iend do
-- calculate middle
imid = math.floor( (istart+iend)/2 )
-- compare
if fcomp( value, t[imid] ) then
iend, istate = imid - 1, 0
else
istart, istate = imid + 1, 1
end
end
table.insert(t, (imid + istate), value)
return (imid + istate)
end
function SortTools.BinarySearch(t, value, equal_func, compare_func)
-- Initialise numbers
local max_t = #t
local istart, iend, imid = 1, max_t, 0
--[[
if istart == iend then
local find_t = nil
if equal_func(t[istart], value) then
find_t = {istart, iend}
end
return find_t
end
]]
-- Binary Search
while istart <= iend do
-- calculate middle
imid = math.floor( (istart+iend)/2 )
-- get compare value
local value2 = t[imid]
-- get all values that match
if equal_func(value, value2) then
local tfound,num = { imid,imid },imid - 1
while (num >= 1) and (equal_func(value, t[num])) do
tfound[1],num = num,num - 1
end
num = imid + 1
while (num <= max_t) and (equal_func(value, t[num])) do
tfound[2],num = num,num + 1
end
return tfound
-- keep searching
elseif compare_func(value, value2) then
iend = imid - 1
else
istart = imid + 1
end
end
end
--冒泡排序
--author:sunny
--list:待排序列表
--sort_word:排序元素
--descending:默认 降序,false 升序
function SortTools.BubbleSort(list,sort_word,descending)
local comp = function(item0,item1)
--将空项排在后面
if item0[sort_word] == nil and item0[sort_word] ~= nil then
return true
end
if item0[sort_word] ~= nil and item1[sort_word] ~= nil then
if descending == false then
--升序
if item0[sort_word] > item1[sort_word] then
return true
end
else
--降序
if item0[sort_word] < item1[sort_word] then
return true
end
end
end
return false
end
local length = #(list)
local result = false
local temp = nil
local flag = true
for i=1,length - 1 do
if not flag then
break
end
flag = false
for k=1,length - i do
result = comp(list[k],list[k+1])
if result then
flag = true
temp = list[k]
list[k] = list[k+1]
list[k+1] = temp
end
end
end
end
--根据func进行冒泡
--返回true,则将后一个替换前一个
--返回false,则不作处理
function SortTools.SortListByFunc(list, func)
local length = #(list)
local result = false
local temp = nil
local flag = true
for i=1,length - 1 do
if not flag then
break
end
flag = false
for k=1,length - i do
result = func(list[k],list[k+1])
if result then
flag = true
temp = list[k]
list[k] = list[k+1]
list[k+1] = temp
end
end
end
end