Array&&GenericArray

自己实现动态数组:

  1. 实现一个大小固定的有序数组,支持动态增删改操作
  2. 实现一个支持动态扩容的泛型数组
  3. 大小固定的有序数组,支持动态增删改操作

    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
    /**
    * @description: 实现一个大小国定的有序数组,支持动态增删改操作。
    * 1)数组的插入、删除、按照下标随机访问操作;
    * 2)数组中的数据是int类型的。
    * @author: rhsphere
    * @since: 2019-05-27 10:21 by jdk 1.8
    */
    public class Array {
    //定义整型数据data保存数据
    public int data[];
    //定义数组长度
    private int n;
    //定义实际中的个数
    private int count;

    //构造方法,定义数组大小
    public Array(int capacity) {
    this.data = new int[capacity];
    this.n = capacity;
    this.count = 0; //初始化后没有存数
    }
    //根据索引找到数据中的元素并返回
    public int find(int index) {
    if (index < 0 || index >= count)
    return -1;
    return data[index];
    }
    //插入元素,尾部插入
    public boolean insert(int index, int value) {
    // 数组空间已满
    if (count == n) {
    System.out.println("没有可插入的位置");
    return false;
    }
    // 如果count还没满,那么就可以插入数据到数组中
    // 位置不合法
    if (index < 0 || index > count) {
    System.out.println("位置不合法");
    return false;
    }
    //位置合法
    for (int i = count; i > index; --i) {
    data[i] = data[i - 1];
    }
    data[index] = value;
    ++count;
    return true;
    }
    //根据索引,删除数组中元素
    public boolean delete(int index) {
    if (index < 0 || index >= count)
    return false;
    //从删除位置开始,将后面的元素向前移动一位
    for (int i = index + 1; i < count; i++) {
    data[i - 1] = data[i];
    }
    count--;
    return true;
    }
    public void printAll() {
    for (int i = 0; i < count; i++) {
    System.out.print(data[i] + " ");
    }
    System.out.println();
    }
    public static void main(String[] args) {
    Array arr = new Array(5);
    arr.printAll();
    arr.insert(0, 3);
    arr.insert(0, 4);
    arr.insert(1, 5);
    arr.insert(3, 9);
    arr.insert(3, 10);
    arr.printAll();
    }
    }

支持动态扩容的泛型数组

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
156
157
158
159
160
161
162
163
164
165
166
167
168
/**
* @description: 实现一个支持动态扩容的泛型数组
* @author: rhsphere
* @since: 2019-05-27 10:43 by jdk 1.8
*/
public class GenericArray<T> {
private T[] data;
private int size;

// 根据传入容量,构造Array
public GenericArray(int capacity) {
data = (T[]) new Object[capacity];
size = 0;
}

// 无参构造方法,默认数组容量为10
public GenericArray() {
this(10);
}

// 获取数组容量
public int getCapacity() {
return data.length;
}

// 获取当前元素个数
public int count() {
return size;
}

// 判断数组是否为空
public boolean isEmpty() {
return size == 0;
}

// 修改 index 位置的元素
public void set(int index, T e) {
checkIndex(index);
data[index] = e;
}

// 获取对应 index 位置的元素
public T get(int index) {
checkIndex(index);
return data[index];
}

// 查看数组是否包含元素e
public boolean contains(T e) {
for (int i = 0; i < size; i++) {
if (data[i].equals(e)) {
return true;
}
}
return false;
}

// 获取对应元素的下标, 未找到,返回 -1
public int find(T e) {
for ( int i = 0; i < size; i++) {
if (data[i].equals(e)) {
return i;
}
}
return -1;
}


// 在 index 位置,插入元素e, 时间复杂度 O(m+n)
public void add(int index, T e) {
checkIndex(index);
// 如果当前元素个数等于数组容量,则将数组扩容为原来的2倍
if (size == data.length) {
resize(2 * data.length);
}

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);
}

// 删除 index 位置的元素,并返回
public T remove(int index) {
checkIndexForRemove(index);

T ret = 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 ret;
}

// 删除第一个元素
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);
}
}

@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append(String.format("Array size = %d, capacity = %d \n", size, data.length));
builder.append('[');
for (int i = 0; i < size; i++) {
builder.append(data[i]);
if (i != size - 1) {
builder.append(", ");
}
}
builder.append(']');
return builder.toString();
}


// 扩容方法,时间复杂度 O(n)
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.");
}
}
}

0%