本帖最后由 九霄道长 于 2021-6-27 14:47 编辑
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 +
'}';
}
}
|