array.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. package array
  2. import (
  3. "bytes"
  4. "fmt"
  5. "reflect"
  6. )
  7. type Array struct {
  8. data []interface{}
  9. size int
  10. }
  11. // 构造函数,传入数组的容量capacity构造Array
  12. func New(capacity int) *Array {
  13. return &Array{
  14. data: make([]interface{}, capacity),
  15. }
  16. }
  17. // 获取数组的容量
  18. func (a *Array) GetCapacity() int {
  19. return len(a.data)
  20. }
  21. // 获得数组中的元素个数
  22. func (a *Array) GetSize() int {
  23. return a.size
  24. }
  25. // 返回数组是否为空
  26. func (a *Array) IsEmpty() bool {
  27. return a.size == 0
  28. }
  29. // 在第 index 个位置插入一个新元素 e
  30. func (a *Array) Add(index int, e interface{}) {
  31. if index < 0 || index > a.size {
  32. panic("add failed, index out of range")
  33. }
  34. if a.size == len(a.data) {
  35. a.resize(2 * a.size)
  36. }
  37. for i := a.size - 1; i >= index; i-- {
  38. a.data[i+1] = a.data[i]
  39. }
  40. a.data[index] = e
  41. a.size++
  42. }
  43. // 向所有元素后添加一个新元素
  44. func (a *Array) AddLast(e interface{}) {
  45. a.Add(a.size, e)
  46. }
  47. // 向所有元素前添加一个新元素
  48. func (a *Array) AddFirst(e interface{}) {
  49. a.Add(0, e)
  50. }
  51. // 获取 index 索引位置的元素
  52. func (a *Array) Get(index int) interface{} {
  53. a.checkIndex(index)
  54. return a.data[index]
  55. }
  56. // 修改 index 索引位置的元素
  57. func (a *Array) Set(index int, e interface{}) {
  58. a.checkIndex(index)
  59. a.data[index] = e
  60. }
  61. // 查找数组中是否有元素 e
  62. func (a *Array) Contains(e interface{}) bool {
  63. for i := 0; i < a.size; i++ {
  64. if Compare(a.data[i], e) == 0 {
  65. return true
  66. }
  67. }
  68. return false
  69. }
  70. // 查找数组中元素 e 所在的索引,不存在则返回 -1
  71. func (a *Array) Find(e interface{}) int {
  72. for i := 0; i < a.size; i++ {
  73. if Compare(a.data[i], e) == 0 {
  74. return i
  75. }
  76. }
  77. return -1
  78. }
  79. // 查找数组中元素 e 所有的索引组成的切片,不存在则返回 -1
  80. func (a *Array) FindAll(e interface{}) (indexes []int) {
  81. for i := 0; i < a.size; i++ {
  82. if Compare(a.data[i], e) == 0 {
  83. indexes = append(indexes, i)
  84. }
  85. }
  86. return
  87. }
  88. // 从数组中删除 index 位置的元素,返回删除的元素
  89. func (a *Array) Remove(index int) interface{} {
  90. a.checkIndex(index)
  91. e := a.data[index]
  92. for i := index + 1; i < a.size; i++ {
  93. a.data[i-1] = a.data[i]
  94. }
  95. a.size--
  96. a.data[a.size] = nil //loitering object != memory leak
  97. // 考虑边界条件,避免长度为 1 时,resize 为 0
  98. if a.size == len(a.data)/4 && len(a.data)/2 != 0 {
  99. a.resize(len(a.data) / 2)
  100. }
  101. return e
  102. }
  103. // 从数组中删除第一个元素,返回删除的元素
  104. func (a *Array) RemoveFirst() interface{} {
  105. return a.Remove(0)
  106. }
  107. // 从数组中删除最后一个元素,返回删除的元素
  108. func (a *Array) RemoveLast() interface{} {
  109. return a.Remove(a.size - 1)
  110. }
  111. // 从数组中删除一个元素 e
  112. func (a *Array) RemoveElement(e interface{}) bool {
  113. index := a.Find(e)
  114. if index == -1 {
  115. return false
  116. }
  117. a.Remove(index)
  118. return true
  119. }
  120. // 从数组中删除所有元素 e
  121. func (a *Array) RemoveAllElement(e interface{}) bool {
  122. if a.Find(e) == -1 {
  123. return false
  124. }
  125. for i := 0; i < a.size; i++ {
  126. if Compare(a.data[i], e) == 0 {
  127. a.Remove(i)
  128. }
  129. }
  130. return true
  131. }
  132. // 为数组扩容
  133. func (a *Array) resize(newCapacity int) {
  134. newData := make([]interface{}, newCapacity)
  135. for i := 0; i < a.size; i++ {
  136. newData[i] = a.data[i]
  137. }
  138. a.data = newData
  139. }
  140. func (a *Array) checkIndex(index int) {
  141. if index < 0 || index >= a.size {
  142. panic(fmt.Sprintf("index is out of range, required range: [0, %d) but get %d", a.size, index))
  143. }
  144. }
  145. // 重写 Array 的 string 方法
  146. func (a *Array) String() string {
  147. var buffer bytes.Buffer
  148. buffer.WriteString(fmt.Sprintf("Array: size = %d, capacity = %d\n", a.size, len(a.data)))
  149. buffer.WriteString("[")
  150. for i := 0; i < a.size; i++ {
  151. // fmt.Sprint 将 interface{} 类型转换为字符串
  152. buffer.WriteString(fmt.Sprint(a.data[i]))
  153. if i != (a.size - 1) {
  154. buffer.WriteString(", ")
  155. }
  156. }
  157. buffer.WriteString("]")
  158. return buffer.String()
  159. }
  160. func Compare(a interface{}, b interface{}) int {
  161. aType := reflect.TypeOf(a).String()
  162. bType := reflect.TypeOf(b).String()
  163. if aType != bType {
  164. panic("cannot compare different type params")
  165. }
  166. switch a.(type) {
  167. case int:
  168. if a.(int) > b.(int) {
  169. return 1
  170. } else if a.(int) < b.(int) {
  171. return -1
  172. } else {
  173. return 0
  174. }
  175. case string:
  176. if a.(string) > b.(string) {
  177. return 1
  178. } else if a.(string) < b.(string) {
  179. return -1
  180. } else {
  181. return 0
  182. }
  183. case float64:
  184. if a.(float64) > b.(float64) {
  185. return 1
  186. } else if a.(float64) < b.(float64) {
  187. return -1
  188. } else {
  189. return 0
  190. }
  191. default:
  192. panic("unsupported type params")
  193. }
  194. }
  195. func (a *Array) Swap(i int, j int) {
  196. if i < 0 || i >= a.size || j < 0 || j >= a.size {
  197. panic("index is out of range")
  198. }
  199. a.data[i], a.data[j] = a.data[j], a.data[i]
  200. }