-
Notifications
You must be signed in to change notification settings - Fork 0
/
dynamic_array.go
155 lines (128 loc) · 2.92 KB
/
dynamic_array.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package array
import (
"fmt"
"strings"
)
const (
DefaultCapacity = 10
)
// Option 数组初始化的选项函数
type Option func(*DynamicArray)
// DynamicArray 实现动态数组
type DynamicArray struct {
capacity int
size int
items []interface{}
}
// WithCapacity 设置数组的初始容量
func WithCapacity(capacity int) Option {
return func(a *DynamicArray) {
a.capacity = capacity
}
}
// New 返回一个空动态数组
func New(opts ...Option) *DynamicArray {
arr := DynamicArray{
capacity: DefaultCapacity,
size: 0,
}
for _, o := range opts {
o(&arr)
}
arr.items = make([]interface{}, arr.capacity)
return &arr
}
func (a *DynamicArray) Get(index int) interface{} {
if index < 0 || index >= a.size {
panic("Get item failed, index out of range.")
}
return a.items[index]
}
func (a *DynamicArray) Append(item interface{}) {
if a.size == a.capacity {
a.resize(a.capacity * 2)
}
a.items[a.size] = item
a.size++
}
func (a *DynamicArray) Set(index int, item interface{}) {
if index < 0 || index >= a.size {
panic("Set item failed, index out of range.")
}
a.items[index] = item
}
func (a *DynamicArray) Insert(index int, item interface{}) {
if index < 0 || index > a.size {
panic("Insert item failed, index out of range.")
}
// 当数组的元素数量等于数组容量时需要进行扩容
if a.size == a.capacity {
a.resize(a.capacity * 2)
}
for i := a.size - 1; i >= index; i-- {
a.items[i+1] = a.items[i]
}
a.items[index] = item
a.size++
}
func (a *DynamicArray) Remove(index int) interface{} {
if index < 0 || index >= a.size {
panic("Remove item failed, index out of range.")
}
v := a.items[index]
for i := index; i < a.size-1; i++ {
a.items[i] = a.items[i+1]
}
a.items[a.size-1] = nil
a.size--
// 当数组的元素数量等于数组容量的1/4时需要进行缩容
// 同时需要考虑边界情况,缩容后的容量不能为0
if a.size == a.capacity/4 && a.capacity/2 != 0 {
a.resize(a.capacity / 2)
}
return v
}
func (a *DynamicArray) Contains(item interface{}) bool {
for i := 0; i < a.size; i++ {
if a.items[i] == item {
return true
}
}
return false
}
func (a *DynamicArray) Search(item interface{}) int {
for i := 0; i < a.size; i++ {
if a.items[i] == item {
return i
}
}
return -1
}
func (a *DynamicArray) IsEmpty() bool {
return a.size == 0
}
func (a *DynamicArray) Size() int {
return a.size
}
func (a *DynamicArray) Capacity() int {
return a.capacity
}
// resize 进行数组的扩缩容
func (a *DynamicArray) resize(capacity int) {
newItems := make([]interface{}, capacity)
copy(newItems, a.items)
a.capacity = capacity
a.items = newItems
}
func (a *DynamicArray) String() string {
var builder strings.Builder
builder.WriteString("[")
for i := 0; i < a.size; i++ {
builder.WriteString(fmt.Sprint(a.items[i]))
if i != a.size-1 {
builder.WriteString(", ")
}
}
builder.WriteString("]")
return builder.String()
}