//二、自定义数组(动态数组),比自带的数组功能更多,使用方法更灵活。//增删改查public class CustomizedArray {
private int[] data;//存储数据 private int size;//数组中实际数据个数,和data.length不是一回事。可以理解为下一个可以存放元素的下标。
// 构造函数,根据传入数组的容量capacity构造Array public CustomizedArray(int capacity){
data = new int[capacity];
size = 0;//刚创建时有效元素个数就是0 }
// 无参数的构造函数,默认数组的容量capacity=10 public CustomizedArray(){
this(10);//相当于调用CustomizedArray(10) }
// 获取数组的容量 public int getCapacity(){
return data.length;
}
// 获取数组中的元素个数 public int getSize(){
return size;
}
// 返回数组是否为空 public boolean isEmpty(){
return size == 0;
}
// 在index索引的位置插入一个新元素e //思路:如果index位置后面有元素,那么index位置及其之后的所有元素都要往后移动一位 //所以要先判断是否能移动(是否满),以及index的位置是否合法 //假设size为7,那么在0~6号位置已经有了元素,那么可以插入的位置有0~7,其它位置不可以插入
public void add(int index, int e){
if(size == data.length)//数组已满 throw new IllegalArgumentException("Add failed. Array is full.");
if(index < 0 || index > size)//插入位置不合法 throw new IllegalArgumentException("Add failed. Require index >= 0 and index <= size.");
//后移:size - 1才是最后一个元素的数组下标,所以从size - 1位置到index位置的所有元素后移 for(int i = size - 1; i >= index ; i --)
data[i + 1] = data[i];//顺序后移
data[index] = e;//插入元素 size ++;//有效元素个数加一 }
//给数组增加元素 // 向所有元素后添加一个新元素 public void addLast(int e){
add(size, e);//目前有size个有效元素,下一个可以存放元素的下标是size。 }
// 在所有元素前添加一个新元素 public void addFirst(int e){
add(0, e);
}
// 获取index索引位置的元素 public int get(int index){
if(index < 0 || index >= size)
throw new IllegalArgumentException("Get failed. Index is illegal.");
return data[index];
}
// 修改index索引位置的元素为e public void set(int index, int e){
if(index < 0 || index >= size)
throw new IllegalArgumentException("Set failed. Index is illegal.");
data[index] = e;
}
// 查找数组中是否有元素e public boolean contains(int e){
for(int i = 0 ; i < size ; i ++){
if(data[i] == e)
return true;
}
return false;
}
// 查找数组中元素e所在的索引,如果不存在元素e,则返回-1 public int find(int e){
for(int i = 0 ; i < size ; i ++){
if(data[i] == e)
return i;
}
return -1;
}
// 从数组中删除index位置的元素, 返回删除的元素 public int remove(int index){
if(index < 0 || index >= size)
throw new IllegalArgumentException("Remove failed. Index is illegal.");
//因为要返回删除的元素,所以要先存储下来 int ret = data[index];
//删除index位置的元素,那么index+1~size-1的所有位置的元素都要往前移动 for(int i = index + 1 ; i < size ; i ++)
data[i - 1] = data[i];//顺序前移 size --;//有效元素个数减一 return ret;
}
// 从数组中删除第一个元素, 返回删除的元素 public int removeFirst(){
return remove(0);
}
// 从数组中删除最后一个元素, 返回删除的元素 public int removeLast(){
return remove(size - 1);
}
// 从数组中删除元素e public void removeElement(int e){
//先查找元素e在数组中的索引,找不到则为-1 int index = find(e);
if(index != -1)//找到了该元素的索引 remove(index);//调用remove函数进行删除 }
@Override
public String toString(){
StringBuilder res = new StringBuilder();
res.append(String.format("Array: size = %d , capacity = %d\n", size, data.length));
res.append('[');
for(int i = 0 ; i < size ; i ++){
res.append(data[i]);
if(i != size - 1)//只要不是最后一个元素,那么在输出每个元素时,添加一个“,”隔开 res.append(", ");
}
res.append(']');
return res.toString();
}
public static void main(String[] args) {
CustomizedArray arr = new CustomizedArray(20);
for(int i = 0 ; i < 10 ; i ++)
arr.addLast(i);
System.out.println(arr);
//[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] arr.add(1, 100);
System.out.println(arr);
//[0, 100, 1, 2, 3, 4, 5, 6, 7, 8, 9] arr.addFirst(-1);
System.out.println(arr);
// [-1, 0, 100, 1, 2, 3, 4, 5, 6, 7, 8, 9]
arr.remove(2);
System.out.println(arr);
//[-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
arr.removeElement(4);
System.out.println(arr);
//[-1, 0, 1, 2, 3, 5, 6, 7, 8, 9]
arr.removeFirst();
System.out.println(arr);
//[0, 1, 2, 3, 5, 6, 7, 8, 9]
}
}