forked from iMeiji/Algorithm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathArray.java
151 lines (120 loc) · 2.97 KB
/
Array.java
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
package struct.array;
/**
* 数组
* 插入元素(头部、尾部、指定下角标)
* 删除元素(头部、尾部、指定下角标)
* 扩容
*
* @param <T>
*/
public class Array<T> {
private T[] data;
private int size;
public Array(int capacity) {
this.data = (T[]) new Object[capacity];
this.size = 0;
}
public Array() {
this(10);
}
public static void main(String[] args) {
Array arr = new Array(5);
arr.add(0, 0);
arr.add(1, 0);
arr.add(2, 0);
arr.add(3, 0);
arr.add(4, 0);
arr.add(5, 0);
arr.remove(4);
arr.remove(3);
}
public int getCapcaity() {
return data.length;
}
public int count() {
return size;
}
public void set(int index, T e) {
checkIndex(index);
data[index] = e;
}
public T get(int index) {
checkIndex(index);
return data[index];
}
public boolean contains(T e) {
for (int i = 0; i < size; i++) {
if (data[i].equals(e)) {
return true;
}
}
return false;
}
public int find(T e) {
for (int i = 0; i < size; i++) {
if (data[i].equals(e)) {
return i;
}
}
return -1;
}
public void add(int index, T e) {
checkIndex(index);
if (size == data.length) {
resize(data.length * 2);
}
for (int i = size - 1; i >= index; i--) {
data[i + 1] = data[i];
}
data[index] = e;
size++;
}
public void addFirst(T e) {
add(0, e);
}
public void addLast(T e) {
add(size, e);
}
public T remove(int index) {
checkIndexForRemove(index);
T result = data[index];
for (int i = index + 1; i < size; i++) {
data[i - 1] = data[i];
}
size--;
data[size] = null;
if (size == data.length / 4 && data.length / 2 != 0) {
resize(data.length / 2);
}
return result;
}
public T removeFirst() {
return remove(0);
}
public T removeLast() {
return remove(size - 1);
}
public void removeElement(T e) {
int index = find(e);
if (index != -1) {
remove(index);
}
}
private void resize(int capacity) {
T[] newData = (T[]) new Object[capacity];
for (int i = 0; i < size; i++) {
newData[i] = data[i];
}
data = newData;
}
private void checkIndex(int index) {
if (index < 0 || index > size) {
throw new IllegalArgumentException("Add failed! Require index >=0 and index <= size.");
}
}
private void checkIndexForRemove(int index) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("remove failed! Require index >=0 and index < size.");
}
}
}