package Data; | |
import java.util.Arrays; | |
/** | |
* Describe: | |
* Author: 九霄道长 | |
* CreateTime: 2021/6/25 15:41 | |
*/ | |
public class ArrayPlus<T> { | |
/** | |
* 主数组容器 | |
* 泛型 数组 | |
*/ | |
private T[] data; | |
/** | |
* 当前元素的个数 | |
*/ | |
private int size; | |
/** | |
* 自定义容量 | |
* | |
* @param capacity | |
*/ | |
public ArrayPlus(int capacity) { | |
//创建一个泛型的指定大小的数组 | |
this.data = (T[]) new Object[capacity]; | |
this.size = 0; | |
} | |
/** | |
* 默认的空参构造 | |
*/ | |
public ArrayPlus() { | |
this(10); | |
} | |
/** | |
* 当前元素的个数 | |
* | |
* @return | |
*/ | |
public int getSize() { | |
return this.size; | |
} | |
/** | |
* 获取数组的长度 | |
*/ | |
public int getLength() { | |
return this.data.length; | |
} | |
/** | |
* 判断数组是否为空 | |
*/ | |
public boolean isEmpty() { | |
return this.size == 0; | |
} | |
/** | |
* 尾部添加元素 | |
* | |
* @param e | |
*/ | |
public void add(T e) { | |
add(size, e); | |
} | |
/** | |
* 头添加元素 | |
* | |
* @param e | |
*/ | |
public void addFirst(T e) { | |
add(0, e); | |
} | |
/** | |
* 在index位置插入元素 | |
* | |
* @param e | |
*/ | |
public void add(int index, T e) { | |
checkIndexForAdd(index); | |
if (size == data.length) { | |
resize(2 * data.length); | |
} | |
//从插入的位置开始 所有元素往后挪一位 | |
for (int i = size - 1; i >= index; i--) { | |
data[i + 1] = data[i]; | |
} | |
this.data[index] = e; | |
size++; | |
} | |
// 查看数组是否包含元素e | |
public boolean contains(T e) { | |
for (int i = 0; i < size; i++) { | |
if (data[i].equals(e)) { | |
return true; | |
} | |
} | |
return false; | |
} | |
/** | |
* O(1)级别的交换插入 | |
* | |
* @param index | |
* @param e | |
*/ | |
public void addPlus(int index, T e) { | |
checkIndexForAdd(index); | |
if (size == data.length) { | |
resize(2 * data.length); | |
} | |
//把被修改的元素放到最后面 | |
this.data[size++] = this.data[index]; | |
this.data[index] = e; | |
} | |
public T remove(int index) { | |
checkIndex(index); | |
T ret = data[index]; | |
//整体向前挪一位 | |
for (int i = index + 1; i < size; i++) { | |
data[i - 1] = this.data[i]; | |
} | |
size--; | |
data[size] = null; | |
// 数组缩容 | |
if (size <= data.length / 2) { | |
resize(data.length / 2); | |
} | |
return ret; | |
} | |
/** | |
* 查找数组元素 | |
* | |
* @param index | |
* @return | |
*/ | |
public T get(int index) { | |
checkIndex(index); | |
return this.data[index]; | |
} | |
/** | |
* 自动扩容 | |
* | |
* @param newSize | |
*/ | |
private void resize(int newSize) { | |
T[] newArray = (T[]) new Object[newSize]; | |
for (int i = 0; i < size; i++) { | |
newArray[i] = this.data[i]; | |
} | |
this.data = newArray; | |
} | |
/** | |
* 检查下标越界 | |
* | |
* @param index | |
*/ | |
private void checkIndex(int index) { | |
if (index < 0 || index >= size) { | |
throw new IndexOutOfBoundsException("error!!! 下标越界"); | |
} | |
} | |
private void checkIndexForAdd(int index) { | |
if (index < 0 || index > size) { | |
throw new IndexOutOfBoundsException("error!!! 下标越界"); | |
} | |
} | |
@Override | |
public String toString() { | |
return "ArrayPlus{" + | |
"data=" + Arrays.toString(data) + | |
", size=" + size + | |
'}'; | |
} | |
} |
自己实现一个java的arraylist
Java
366
0
0
2022-05-04
登录后可点赞和收藏
登录后可点赞和收藏