array.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. package helper
  2. type Array struct {
  3. data []interface{} // 泛型数组
  4. size int // 元素数量
  5. }
  6. type ArrayInterface interface {
  7. // 添加
  8. Add(int, interface{}) // 插入元素
  9. AddLast(interface{})
  10. AddFirst(interface{})
  11. // 删除
  12. Remove(int) interface{}
  13. RemoveFirst() interface{}
  14. RemoveLast() interface{}
  15. // 查找
  16. Find(interface{}) int // 查找元素返回第一个索引
  17. FindAll(interface{}) []int // 查找元素返回所有索引
  18. Contains(interface{}) bool // 查找是否存在元素
  19. Get(int) interface{}
  20. // 修改
  21. Set(int, interface{})
  22. // 基本方法
  23. GetCapacity() int // 获得数组容量
  24. GetSize() int // 获得元素个数
  25. IsEmpty() bool // 查看数组是否为空
  26. }
  27. // 获得自定义数组,参数为数组的初始长度
  28. func GetArray(capacity int) *Array {
  29. arr := &Array{}
  30. arr.data = make([]interface{}, capacity)
  31. arr.size = 0
  32. return arr
  33. }
  34. // 获得数组容量
  35. func (a *Array) GetCapacity() int {
  36. return len(a.data)
  37. }
  38. // 获得数组元素个数
  39. func (a *Array) GetSize() int {
  40. return a.size
  41. }
  42. // 判断数组是否为空
  43. func (a *Array) IsEmpty() bool {
  44. return a.size == 0
  45. }
  46. // newCapacity 新数组容量
  47. // 逻辑:声明新的数组,将原数组的值 copy 到新数组中
  48. func (a *Array) resize(newCapacity int) {
  49. newArr := make([]interface{}, newCapacity)
  50. for i := 0; i < a.size; i++ {
  51. newArr[i] = a.data[i]
  52. }
  53. a.data = newArr
  54. }
  55. // 获得元素的首个索引,不存在则返回 -1
  56. func (a *Array) Find(element interface{}) int {
  57. for i := 0; i < a.size; i++ {
  58. if element == a.data[i] {
  59. return i
  60. }
  61. }
  62. return -1
  63. }
  64. // 获得元素的所有索引,返回索引组成的切片
  65. func (a *Array) FindAll(element interface{}) (indexes []int) {
  66. for i := 0; i < a.size; i++ {
  67. if element == a.data[i] {
  68. indexes = append(indexes, i)
  69. }
  70. }
  71. return
  72. }
  73. // 查看数组是否存在元素,返回 bool
  74. func (a *Array) Contains(element interface{}) bool {
  75. if a.Find(element) == -1 {
  76. return false
  77. }
  78. return true
  79. }
  80. // 获得索引对应元素,需要判断索引有效范围
  81. func (a *Array) Get(index int) interface{} {
  82. if index < 0 || index > a.size-1 {
  83. panic("Get failed, index is illegal.")
  84. }
  85. return a.data[index]
  86. }
  87. //修改索引对应元素值
  88. func (a *Array) Set(index int, element interface{}) {
  89. if index < 0 || index > a.size-1 {
  90. panic("Set failed, index is illegal.")
  91. }
  92. a.data[index] = element
  93. }
  94. func (a *Array) Add(index int, element interface{}) {
  95. if index < 0 || index > a.GetCapacity() {
  96. panic("Add failed, require index >= 0 and index <= capacity")
  97. }
  98. // 数组已满则扩容
  99. if a.size == len(a.data) {
  100. a.resize(2 * a.size)
  101. }
  102. // 将插入的索引位置之后的元素后移,腾出插入位置
  103. for i := a.size - 1; i >= index; i-- {
  104. a.data[i+1] = a.data[i]
  105. }
  106. a.data[index] = element
  107. // 维护数组元素的数量
  108. a.size++
  109. }
  110. func (a *Array) AddLast(element interface{}) {
  111. a.Add(a.size, element)
  112. }
  113. func (a *Array) AddFirst(element interface{}) {
  114. a.Add(0, element)
  115. }
  116. func (a *Array) Remove(index int) interface{} {
  117. if index < 0 || index >= a.size {
  118. panic("Remove failed, index is illegal.")
  119. }
  120. removeEle := a.data[index]
  121. // 从 index 之后的元素,都向前移动一个位置
  122. for i := index + 1; i < a.size; i++ {
  123. a.data[i-1] = a.data[i]
  124. }
  125. a.size--
  126. // 清理最后一个元素
  127. a.data[a.size] = nil
  128. // 考虑边界情况,不能 resize 为0
  129. if a.size == len(a.data)/4 && len(a.data)/2 != 0 {
  130. a.resize(len(a.data) / 2)
  131. }
  132. return removeEle
  133. }
  134. func (a *Array) RemoveFirst() interface{} {
  135. return a.Remove(0)
  136. }
  137. func (a *Array) RemoveLast() interface{} {
  138. return a.Remove(a.size - 1)
  139. }
  140. //重写 String 方法
  141. //重写数组打印时的展示形式,只需要重写 String 方法
  142. //func (a *Array) String() string {
  143. // var buffer bytes.Buffer
  144. // buffer.WriteString(fmt.Sprintf("Array: size = %d, capacity = %d\n", a.size, a.GetCapacity()))
  145. // buffer.WriteString("[")
  146. // for i := 0; i < a.size; i++ {
  147. // buffer.WriteString(fmt.Sprint(a.data[i]))
  148. // if i != a.size - 1 {
  149. // buffer.WriteString(",")
  150. // }
  151. // }
  152. // buffer.WriteString("]")
  153. // return buffer.String()
  154. //}//