数组增删改查,创建一个ArrayList方法,写出(add()增加,insert()插入,delete()删除一个元素,deleteall()删除这个数组中所有相同元素,orderInsert()有序数组插入的操作)。
基本变量
int[] arr; //默认存储个数为10 int size;//有效数字个数 int capacity;//容量 double factor;//因数 public ArrayList() { factor = 1.5; size = 0; capacity = 10; arr = new int[capacity]; }
1,增加元素
public void add(int value) { if(size == arr.length) { capacity = (int)(capacity*factor); int[] temp = new int[capacity]; for(int i = 0;i<arr.length;i++) { temp[i]=arr[i]; } arr = temp; } //插入数据 arr[size] = value; size++; }
当有效元素个数等于容量长度时,容量扩大1.5倍,新创建一个数组,并将原数组的值复制到新数组中,且地址也只想原数组。
2,插入元素
public void insert(int value,int position) { if(position<0||position>size) { System.out.println("插入位置不合理"); return; } if(size == arr.length) { capacity = (int)(capacity*factor); int[] temp = new int[capacity]; for(int i = 0;i<arr.length;i++) { temp[i]=arr[i]; } arr = temp; } for(int i = size - 1;i>=position;i--) { arr[i+1] = arr[i]; } arr[position] = value; size++; }
首先判断插入位置是否位于数组中,然后判断是否要扩容,最后将位于插入位置之后的元素从最后一个开始一个个后移。
3,删除一个元素
public boolean delete(int value) { for(int i = 0;i<size;i++) { if(arr[i] == value) { for(int j = i;j<size-1;j++) { arr[j] = arr[j+1]; } size--; return true; } } return false; }
重新遍历数组找到第一个要删除的元素,将其从后一个元素开始将后一个覆盖前一个元素完成删除。
4,删除数组中所有相同元素
public boolean deleteall(int value) { boolean isFond = false; for(int i = size;i>=0;i--) { if(arr[i] == value) { for(int j = i;j<size-1;j++) { arr[j] = arr[j+1]; } size--; isFond = true; } } return isFond; }
与delete()不同,要从最后一个元素开始向前遍历,找到每个要删除元素后,再将其用后面元素覆盖,这样不会漏掉。
5,有序数组的插入
public void orderInsert(int value) { if(size == arr.length) { //满了扩容 capacity = (int)(capacity*factor); int[] temp = new int[capacity]; for(int i = 0;i<arr.length;i++) { temp[i]=arr[i]; } arr = temp; } //插入 if(size == 0) { arr[0] = value; }else if(arr[size-1]<=value){ arr[size] = value; }else { for(int i = 0;i<size;i++) { if(arr[i] > value) { //i即为要插入的位置 //插入位置及其之后的数据统一向后移动 for(int temp = size - 1;temp>=i;temp--) { arr[temp+1] = arr[temp]; } //插入数据 arr[i] = value; break; } } } size++; } }
首先判断是否要满,然后判断插入的位置最大就在最后,没有元素就是第一个,都不是,就从头遍历,插入位置及其之后的数据统一向后移动,因为是要插入一个元素,而函数第一步就确保数组一定会有大于一的空位,所以不会溢出。
如何确保打印出来数组
ArrayList list = new ArrayList();
ArrayList的返回值可以是一个字符串
public String toString() { String aString = "["; for(int i = 0;i<size;i++) { if(i==size-1) { aString += " " + arr[i]; }else { aString += " " +arr[i] + ","; } } aString += " ]"; return aString; }
通过字符串拼接来打印数组。