目录
1.增加操作:
在头部插入:
public void addFirst(int value){ if(size==data.length){ System.out.println("数组进行了扩容"); //所以数组要扩容,写一个方法给他扩容 grow(); } //先将数组最后一个元素开始一个一个向后搬移 //这里不存在扩容的问题,因为前面已经扩容了 for(int i=size-1;i>=0;i--){ data[i+1]=data[i]; } //此时data[0]空出来了 data[0]=value; size++; }
在尾部插入
public void addLast(int value){ //所有这类操作都要先判断数组是否已满 if(size==data.length){ System.out.println("数组进行了扩容"); //所以数组要扩容,写一个方法给他扩容 grow(); } data [size]=value; size++; }
在这里判断都要判断数组是否已满,如果已满调用grow()方法进行扩容操作
在中间位置插入
public void addIndex(int index,int value){ //传入的索引值和要插入的新元素 //判断用户传入的index是否合法 //要使size属性保持连续性 if(size==data.length) { grow(); } //这里要先扩容,然后判断合法性 if(index<0||index>size){ System.out.println("index不合法"); return; } if(index==0){ addFirst(value); return; //不加会走下面的else分支 } if(index==size){ addLast(value);//这里不用加else 因为他俩是一对,else最近匹配原则 }else{ for(int i=size-1;i>=index;i--){//这里的index的等于号注意思考 data[i+1]=data[i]; } data [index]=value; size++; }
这里要先进行扩容判断,然后再判断索引的合法性,顺序不可颠倒
可以发现在头删和尾删可以看作是任意位置的中间删除,头删就是索引为0的删除,尾删就是索引为size-1的删除。
所以可以对上面的代码进行优化。
//在头部插入 public void addFirst(int value){ addIndex(0,value); } /* * 在尾部插入 * */ public void addLast(int value){ //所有这类操作都要先判断数组是否已满 addIndex(size,value); } /*在数组的任意位置插入 * */ public void addIndex(int index,int value){ //传入的索引值和要插入的新元素 //判断用户传入的index是否合法 //要使size属性保持连续性 if(size==data.length) { grow(); } //这里要先扩容,然后判断合法性 if(index<0||index>size){ System.out.println("index不合法"); return; } for(int i=size-1;i>=index;i--){//这里的index的等于号注意思考 data[i+1]=data[i]; } data [index]=value; size++; }
2.删除操作
2.1按索引删除
/*删除元素*/ public void removeIndex(int index){ if(index<0||index>=size){ //这里可以等于,因为等于的时候数组越界已经不合法了 System.out.println("不合法"); return; } for(int i=index;i<size-1;i++){ data[i]=data[i+1]; } size--; data[size]=0; } public void removeFirst(int Index){ removeIndex(0); } public void removeLast(int Index){ removeIndex(size-1); }
2.2按值删除
/*按值删除*/ public void removeValueOnce(int value) { for (int i = 0; i < size; i++) { if (data[i] == value) { removeIndex(i); return; } //意味着循环没有找到这个值 } } public void removeValueAll(int value){ for(int i=0;i<size;i++){ while(i!=size&&data[i]==value){//因为要一直循环 removeIndex(i); } } } }
3.查询操作
3.1查看当前数组是否存在
/*查询元素是否存在*/ public boolean contains(int value){ int index =getByVaule(value); if(index==-1){ return false; } return true; }
3.2根据索引取得相应位置的元素
/*根据索引查询元素*/ public int get(int index){ //判断合法性 if(index<0||index>=size){ //可以等于,等于的时候数组已经越界了 System.out.println("index不合法"); return -1; } return data[index]; }
3.3查找当前数组中元素的value对应的下标
/*查找当前元素的索引下标*/ public int getByVaule(int value){ //遍历数组 for(int i=0;i<size;i++){ if(data[i]==value){ return i; } } //循环走完还没找到,这数不存在 return -1; }
4.修改操作
4.1根据索引修改原先元素
/*修改原先元素*/ public int set(int index,int newValue){ //先判断是否合法 if(index<0||index>=size){ return -1; } int oldValue=data[index]; data[index]=newValue; return oldValue; }
还有就是测试截图喽!
测试类:
需要源码记得私信我哦!!!
感谢点赞和关注!!