|
|
-
- 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
-
|