源战役客户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

390 line
7.3 KiB

  1. --[[
  2. 0n-1
  3. --]]
  4. Array = Array or BaseClass()
  5. local Array = Array
  6. local table = table
  7. local table_insert = table.insert
  8. local table_remove = table.remove
  9. Array.UPPER = 1 --升序
  10. Array.LOWER = 2 --降序
  11. function Array:__init()
  12. self.size = 0
  13. self.items = {}
  14. end
  15. function Array:IsEmpty()
  16. return self.size <= 0
  17. end
  18. --[[
  19. @para1 val in
  20. @author deadline
  21. @create 5/16/2012
  22. --]]
  23. function Array:PushBack( val )
  24. self.size = self.size + 1
  25. self.items[self.size] = val
  26. end
  27. --[[
  28. @return
  29. @author deadline
  30. @create 5/16/2012
  31. --]]
  32. function Array:PopBack()
  33. if self.size > 0 then
  34. local val =self.items[self.size]
  35. self.items[self.size] = nil
  36. self.size = self.size - 1
  37. return val
  38. end
  39. return nil
  40. end
  41. --[[
  42. @para1 val in
  43. @author deadline
  44. @create 5/18/2012
  45. --]]
  46. function Array:PushFront( val )
  47. table_insert(self.items, 1, val)
  48. self.size = self.size + 1
  49. end
  50. --[[
  51. @return
  52. @author deadline
  53. @create 5/18/2012
  54. --]]
  55. function Array:PopFront()
  56. if self.size > 0 then
  57. local val = self.items[1]
  58. table_remove(self.items, 1)
  59. self.size = self.size - 1
  60. return val
  61. end
  62. return nil
  63. end
  64. --[[
  65. @para1 func in , func(item)
  66. @author deadline
  67. @create 5/16/2012
  68. --]]
  69. function Array:ForEach(func)
  70. for i = 1, self.size do
  71. func(self.items[i],i)
  72. end
  73. end
  74. --[[
  75. @para1 index in
  76. @return
  77. @author deadline
  78. @create 5/18/2012
  79. --]]
  80. function Array:Get(index)
  81. if index < self.size then
  82. return self.items[index + 1]
  83. else
  84. print("Array:Get() out of index! " .. tostring(index))
  85. end
  86. end
  87. function Array:Contains(val)
  88. for i = 1, self.size do
  89. local item = self.items[i]
  90. if item == val then
  91. return true
  92. end
  93. end
  94. return false
  95. end
  96. function Array:IndexOf(val)
  97. for i = 1, self.size do
  98. local item = self.items[i]
  99. if item == val then
  100. return i
  101. end
  102. end
  103. return -1
  104. end
  105. function Array:GetList()
  106. return self.items
  107. end
  108. --[[
  109. @para1 index in
  110. @para2 val in
  111. @author deadline
  112. @create 5/18/2012
  113. --]]
  114. function Array:Set(index, val)
  115. if index < self.size then
  116. self.items[index + 1] = val
  117. else
  118. print("Array:Set() out of index!")
  119. end
  120. end
  121. --[[
  122. @return
  123. @author deadline
  124. @create 5/16/2012
  125. --]]
  126. function Array:GetSize()
  127. return self.size
  128. end
  129. --[[
  130. @para1 key_name in Key()
  131. @author deadline
  132. @create 5/18/2012
  133. --]]
  134. function Array:LowerSort(key_name)
  135. local sort_func
  136. if key_name then
  137. sort_func = SortTools.KeyLowerSorter(key_name)
  138. else
  139. sort_func = SortTools.ItemLowerSorter()
  140. end
  141. table.sort(self.items, sort_func)
  142. end
  143. --[[
  144. @para1 key_name in Key()
  145. @author deadline
  146. @create 5/18/2012
  147. --]]
  148. function Array:UpperSort(key_name)
  149. local sort_func
  150. if key_name then
  151. sort_func = SortTools.KeyUpperSorter(key_name)
  152. else
  153. sort_func = SortTools.ItemUpperSorter()
  154. end
  155. table.sort(self.items, sort_func)
  156. end
  157. --[[
  158. Key查找数组中的一项
  159. @para1 item_key in Key
  160. @para2 val in item_key的值
  161. @para3 offset in
  162. @return ,Index
  163. @author deadline
  164. @create 5/18/2012
  165. --]]
  166. function Array:FindByKey(item_key, val, offset)
  167. offset = offset or 0
  168. for i = offset + 1, self.size do
  169. local item = self.items[i]
  170. if item[item_key] == val then
  171. return item, i-1
  172. end
  173. end
  174. return nil, -1
  175. end
  176. --[[
  177. Key查找数组中的一项
  178. @para1 equal_func in
  179. @para2 offset in
  180. @return ,Index
  181. @author deadline
  182. @create 5/18/2012
  183. --]]
  184. function Array:FindByFunc(equal_func, offset)
  185. offset = offset or 0
  186. for i = offset + 1, self.size do
  187. local item = self.items[i]
  188. if equal_func(item) then
  189. return item, i-1
  190. end
  191. end
  192. return nil, -1
  193. end
  194. --[[
  195. @para1 index in
  196. @author deadline
  197. @create 5/18/2012
  198. --]]
  199. function Array:Erase(index)
  200. index = index or self.size - 1
  201. if index >= 0 and index < self.size then
  202. table_remove(self.items, index + 1)
  203. self.size = self.size -1
  204. end
  205. end
  206. --[[
  207. item
  208. @para1 item
  209. @author deadline
  210. @create 5/18/2012
  211. --]]
  212. function Array:RemoveItem(item)
  213. if item == nil or self.size <= 0 then return end
  214. local value, idx = self:FindByFunc(function (v)
  215. return v == item
  216. end)
  217. if idx ~= -1 then
  218. self:Erase(idx)
  219. end
  220. end
  221. --[[
  222. ]]
  223. function Array:Clear()
  224. self.items = {}
  225. self.size = 0
  226. end
  227. --[[
  228. @para1 key_name in Key()
  229. @author deadline
  230. @create 5/18/2012
  231. --]]
  232. function Array:Insert(item, index)
  233. index = index or 0
  234. table_insert(self.items, index + 1)
  235. self.size = self.size + 1
  236. end
  237. --[[
  238. @para1 begin_pos
  239. @para2 end_pos
  240. @author jkz
  241. @create 8/8/2013
  242. @return array
  243. --]]
  244. function Array:GetSubArray(begin_pos,end_pos)
  245. local ret = Array.New()
  246. local index = 0
  247. local len = self:GetSize()
  248. for i=begin_pos,end_pos-1 do
  249. if i >= len then
  250. break
  251. end
  252. ret:PushBack(self:Get(i))
  253. end
  254. return ret
  255. end
  256. --[[
  257. equal_func的子列表
  258. @para1 equal_func
  259. @author jkz
  260. @create 8/8/2013
  261. @return array
  262. --]]
  263. function Array:Filter(equal_func)
  264. local ret = Array.New()
  265. for i = 1, self.size do
  266. local item = self.items[i]
  267. if equal_func(item) then
  268. ret:PushBack(item)
  269. end
  270. end
  271. return ret
  272. end
  273. --[[
  274. ,
  275. @para1 item in
  276. @para2 comp_func in
  277. @author deadline
  278. @create 5/18/2012
  279. --]]
  280. --[[
  281. function Array:BinaryInsert(item, comp_func)
  282. SortTools.BinaryInsert(self.items, item, comp_func)
  283. end
  284. --]]
  285. function Array.GetArray(array,begin_pos,end_pos)
  286. if array == nil then
  287. return {}
  288. end
  289. local ret = {}
  290. for i=begin_pos,end_pos do
  291. if i > #(array) then
  292. break
  293. end
  294. table_insert(ret,array[i])
  295. end
  296. return ret
  297. end
  298. function Array.GetArrayByScale(array,scale,length)
  299. if array == nil then
  300. return {}
  301. end
  302. local ret = {}
  303. local begin_pos = math.floor(#(array)*scale) + 1
  304. local end_pos = begin_pos+length-1
  305. return Array.GetArray(array,begin_pos,end_pos)
  306. end
  307. --[[
  308. @param arg key
  309. key对应的排序方式:Array.UPPER还是降序:Array.LOWER
  310. @arg = {{key1,key2,...},{Array.UPPER,Array.LOWER,...}}
  311. Array.UPPER
  312. @author jkz
  313. @create 12/18/2013
  314. --]]
  315. function Array:sortOn( ... )
  316. local arg = {...}
  317. local sort_func = nil
  318. if arg == nil or arg[1] == nil then
  319. self:UpperSort()
  320. return
  321. elseif type(arg[1]) ~= "table" or #(arg[1]) <= 1 then
  322. if arg[2] == nil or arg[2] == Array.UPPER then
  323. self:UpperSort(arg[1])
  324. else
  325. self:LowerSort(arg[1])
  326. end
  327. return
  328. end
  329. SortTools.MoreKeysSorter(self.items, arg[1],arg[2])
  330. end