|
|
-
- --[[
- 数组索引由下标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
-
|