|
|
--[[
|
|
数组索引由下标0到下标n-1
|
|
--]]
|
|
|
|
|
|
Array = Array or BaseClass()
|
|
local Array = Array
|
|
local table = table
|
|
local table_insert = table.insert
|
|
local table_remove = table.remove
|
|
Array.UPPER = 1 --升序
|
|
Array.LOWER = 2 --降序
|
|
|
|
function Array:__init()
|
|
self.size = 0
|
|
self.items = {}
|
|
end
|
|
|
|
function Array:IsEmpty()
|
|
return self.size <= 0
|
|
end
|
|
|
|
--[[
|
|
在数组尾部插入一项
|
|
@para1 val in 插入数组的项
|
|
@author deadline
|
|
@create 5/16/2012
|
|
--]]
|
|
function Array:PushBack( val )
|
|
self.size = self.size + 1
|
|
self.items[self.size] = val
|
|
end
|
|
|
|
|
|
--[[
|
|
从数组尾部移除一项并返回
|
|
@return 返回移除的项
|
|
@author deadline
|
|
@create 5/16/2012
|
|
--]]
|
|
function Array:PopBack()
|
|
if self.size > 0 then
|
|
local val =self.items[self.size]
|
|
self.items[self.size] = nil
|
|
self.size = self.size - 1
|
|
return val
|
|
end
|
|
return nil
|
|
end
|
|
|
|
--[[
|
|
从数组头部添加一项
|
|
@para1 val in 一个数组项
|
|
@author deadline
|
|
@create 5/18/2012
|
|
--]]
|
|
function Array:PushFront( val )
|
|
table_insert(self.items, 1, val)
|
|
self.size = self.size + 1
|
|
end
|
|
|
|
|
|
--[[
|
|
从数组头部移除一项并返回
|
|
@return 返回移除的项
|
|
@author deadline
|
|
@create 5/18/2012
|
|
--]]
|
|
function Array:PopFront()
|
|
if self.size > 0 then
|
|
local val = self.items[1]
|
|
table_remove(self.items, 1)
|
|
self.size = self.size - 1
|
|
return val
|
|
end
|
|
return nil
|
|
end
|
|
|
|
--[[
|
|
逐项对数组每一项执行某操作
|
|
@para1 func in 每项执行的函数,类型为 func(item)
|
|
@author deadline
|
|
@create 5/16/2012
|
|
--]]
|
|
function Array:ForEach(func)
|
|
for i = 1, self.size do
|
|
func(self.items[i],i)
|
|
end
|
|
end
|
|
|
|
--[[
|
|
按索引获取数组中的某项
|
|
@para1 index in 数组索引
|
|
@return 返回对应索引的项的项
|
|
@author deadline
|
|
@create 5/18/2012
|
|
--]]
|
|
function Array:Get(index)
|
|
if index < self.size then
|
|
return self.items[index + 1]
|
|
else
|
|
print("Array:Get() out of index! " .. tostring(index))
|
|
end
|
|
end
|
|
|
|
function Array:Contains(val)
|
|
for i = 1, self.size do
|
|
local item = self.items[i]
|
|
if item == val then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function Array:IndexOf(val)
|
|
for i = 1, self.size do
|
|
local item = self.items[i]
|
|
if item == val then
|
|
return i
|
|
end
|
|
end
|
|
return -1
|
|
end
|
|
|
|
|
|
function Array:GetList()
|
|
return self.items
|
|
end
|
|
|
|
--[[
|
|
按索引设置数组中的某项
|
|
@para1 index in 数组索引
|
|
@para2 val in 设置的值
|
|
@author deadline
|
|
@create 5/18/2012
|
|
--]]
|
|
function Array:Set(index, val)
|
|
if index < self.size then
|
|
self.items[index + 1] = val
|
|
else
|
|
print("Array:Set() out of index!")
|
|
end
|
|
end
|
|
|
|
--[[
|
|
逐项对数组每一项执行某操作
|
|
@return 数组大小
|
|
@author deadline
|
|
@create 5/16/2012
|
|
--]]
|
|
function Array:GetSize()
|
|
return self.size
|
|
end
|
|
|
|
--[[
|
|
对数组执行升序排序操作
|
|
@para1 key_name in 用来排序的数组项Key(可选参数)
|
|
@author deadline
|
|
@create 5/18/2012
|
|
--]]
|
|
function Array:LowerSort(key_name)
|
|
local sort_func
|
|
if key_name then
|
|
sort_func = SortTools.KeyLowerSorter(key_name)
|
|
else
|
|
sort_func = SortTools.ItemLowerSorter()
|
|
end
|
|
table.sort(self.items, sort_func)
|
|
end
|
|
|
|
--[[
|
|
对数组执行降序排序操作
|
|
@para1 key_name in 用来排序的数组项Key(可选参数)
|
|
@author deadline
|
|
@create 5/18/2012
|
|
--]]
|
|
function Array:UpperSort(key_name)
|
|
local sort_func
|
|
if key_name then
|
|
sort_func = SortTools.KeyUpperSorter(key_name)
|
|
else
|
|
sort_func = SortTools.ItemUpperSorter()
|
|
end
|
|
table.sort(self.items, sort_func)
|
|
end
|
|
|
|
--[[
|
|
依据项中的Key查找数组中的一项
|
|
@para1 item_key in 用来搜索的数组项Key
|
|
@para2 val in 要查找的item_key的值
|
|
@para3 offset in 开始检索的位置
|
|
@return 返回检索到的项,检索到的项的Index
|
|
@author deadline
|
|
@create 5/18/2012
|
|
--]]
|
|
function Array:FindByKey(item_key, val, offset)
|
|
offset = offset or 0
|
|
for i = offset + 1, self.size do
|
|
local item = self.items[i]
|
|
if item[item_key] == val then
|
|
return item, i-1
|
|
end
|
|
end
|
|
return nil, -1
|
|
end
|
|
|
|
--[[
|
|
依据项中的Key查找数组中的一项
|
|
@para1 equal_func in 用来检测数组项是否符合要求的函数
|
|
@para2 offset in 开始检索的位置
|
|
@return 返回检索到的项,检索到的项的Index
|
|
@author deadline
|
|
@create 5/18/2012
|
|
--]]
|
|
function Array:FindByFunc(equal_func, offset)
|
|
offset = offset or 0
|
|
for i = offset + 1, self.size do
|
|
local item = self.items[i]
|
|
if equal_func(item) then
|
|
return item, i-1
|
|
end
|
|
end
|
|
return nil, -1
|
|
end
|
|
|
|
--[[
|
|
移除对应索引的项
|
|
@para1 index in 待删除的索引
|
|
@author deadline
|
|
@create 5/18/2012
|
|
--]]
|
|
function Array:Erase(index)
|
|
index = index or self.size - 1
|
|
if index >= 0 and index < self.size then
|
|
table_remove(self.items, index + 1)
|
|
self.size = self.size -1
|
|
end
|
|
end
|
|
|
|
|
|
--[[
|
|
移除对应item
|
|
@para1 item 待删除的项目
|
|
@author deadline
|
|
@create 5/18/2012
|
|
--]]
|
|
function Array:RemoveItem(item)
|
|
if item == nil or self.size <= 0 then return end
|
|
local value, idx = self:FindByFunc(function (v)
|
|
return v == item
|
|
end)
|
|
|
|
if idx ~= -1 then
|
|
self:Erase(idx)
|
|
end
|
|
end
|
|
|
|
--[[
|
|
清空数组元素
|
|
]]
|
|
function Array:Clear()
|
|
self.items = {}
|
|
self.size = 0
|
|
end
|
|
|
|
--[[
|
|
在对应位置插入一项
|
|
@para1 key_name in 用来排序的数组项Key(可选参数)
|
|
@author deadline
|
|
@create 5/18/2012
|
|
--]]
|
|
function Array:Insert(item, index)
|
|
index = index or 0
|
|
table_insert(self.items, index + 1)
|
|
self.size = self.size + 1
|
|
end
|
|
|
|
--[[
|
|
返回开始位置到结束位置之间的数组列表
|
|
@para1 begin_pos 开始位置
|
|
@para2 end_pos 结束位置
|
|
@author jkz
|
|
@create 8/8/2013
|
|
@return array
|
|
--]]
|
|
function Array:GetSubArray(begin_pos,end_pos)
|
|
local ret = Array.New()
|
|
local index = 0
|
|
local len = self:GetSize()
|
|
|
|
for i=begin_pos,end_pos-1 do
|
|
|
|
if i >= len then
|
|
break
|
|
end
|
|
ret:PushBack(self:Get(i))
|
|
end
|
|
return ret
|
|
end
|
|
--[[
|
|
返回数组中满足函数equal_func的子列表
|
|
@para1 equal_func 用来检测数组项是否符合要求的函数
|
|
@author jkz
|
|
@create 8/8/2013
|
|
@return array
|
|
--]]
|
|
function Array:Filter(equal_func)
|
|
local ret = Array.New()
|
|
for i = 1, self.size do
|
|
local item = self.items[i]
|
|
if equal_func(item) then
|
|
ret:PushBack(item)
|
|
end
|
|
end
|
|
return ret
|
|
end
|
|
|
|
--[[
|
|
二分查找方式插入一项, 用于快速构建一个排序数组
|
|
@para1 item in 插入到数组中的项
|
|
@para2 comp_func in 比较函数
|
|
@author deadline
|
|
@create 5/18/2012
|
|
--]]
|
|
--[[
|
|
function Array:BinaryInsert(item, comp_func)
|
|
SortTools.BinaryInsert(self.items, item, comp_func)
|
|
end
|
|
--]]
|
|
|
|
function Array.GetArray(array,begin_pos,end_pos)
|
|
|
|
if array == nil then
|
|
return {}
|
|
end
|
|
|
|
local ret = {}
|
|
for i=begin_pos,end_pos do
|
|
|
|
if i > #(array) then
|
|
break
|
|
end
|
|
|
|
table_insert(ret,array[i])
|
|
end
|
|
|
|
return ret
|
|
end
|
|
|
|
|
|
function Array.GetArrayByScale(array,scale,length)
|
|
if array == nil then
|
|
return {}
|
|
end
|
|
|
|
local ret = {}
|
|
local begin_pos = math.floor(#(array)*scale) + 1
|
|
local end_pos = begin_pos+length-1
|
|
return Array.GetArray(array,begin_pos,end_pos)
|
|
end
|
|
|
|
--[[
|
|
对数组执行排序操作
|
|
@param arg 需要比较的表项中的多个key,
|
|
跟key对应的排序方式(升序:Array.UPPER还是降序:Array.LOWER)
|
|
@传参格式:arg = {{key1,key2,...},{Array.UPPER,Array.LOWER,...}}
|
|
不填写排序方式默认为升序Array.UPPER
|
|
@author jkz
|
|
@create 12/18/2013
|
|
--]]
|
|
function Array:sortOn( ... )
|
|
local arg = {...}
|
|
|
|
local sort_func = nil
|
|
if arg == nil or arg[1] == nil then
|
|
self:UpperSort()
|
|
return
|
|
elseif type(arg[1]) ~= "table" or #(arg[1]) <= 1 then
|
|
if arg[2] == nil or arg[2] == Array.UPPER then
|
|
self:UpperSort(arg[1])
|
|
else
|
|
self:LowerSort(arg[1])
|
|
end
|
|
return
|
|
end
|
|
SortTools.MoreKeysSorter(self.items, arg[1],arg[2])
|
|
end
|
|
|