数组简要介绍
数组是一种线性排列的数据结构,并且数组的查询效率很高,而添加和删除的效率就较低。因为数组的数据是按照顺序存储在内存中连续的一段空间内的,所以我们可以通过数组下标来实现对数组中的数据访问。
例如int []arr=new int[20];这条语句在java中相当于在内存中分配一段连续的20倍整形变量大小的空间用来数组的存储,且数组下标从0开始,由于未指定初值,默认每个数组空间存储的都是0。
数组的增删改查实现
数组的增加
由于数组是顺序存储的,所以数组在放入数据时,只需要将数据放在当前数组数据的末尾,也就是left位置,实现方法如下:
private int[]arr=new int[1000];
private int left=0;//标记剩余数量,也代表要插入的位置,初始为0.
public void add(int num) {
arr[left]=num;
left++;//插入后,left后移
}
数组的数据删除
若要删除数组中数据的话,有两种情况,一种是依据数组下标进行删除,另一种是依据数组中某项数据全部删除。任何删除都存在数组中数据移动的情况,需要谨慎处理。
依据数组下标删除
首先判断所给数组下标是否已经超出当前存储数据的下标 ,有则发出警告信息,否则删除,从当前删除数据的位置,依次将数据前移一位,同时left也要减少一位。
public void delByIndex(int index) {
if(index>=left) {
System.out.println("没有要删除的数据");
}else {
for(int i=index;i<left-1;i++) {
arr[i]=arr[i+1];
}
left--;
}
}
依据数值删除(两种删除思路)
一、人类正向思维思考问题,我们遇到要删除的数据就跳过它,将它后面的数据挪前,遍历整个数组,删除所有待删数据,遇到连续多个时,将它一次性跨越掉。
public void delByValue1(int value) {
int move=0;
for(int i=0;i<left;i++) {
if(arr[i]==value) {
move++;
for(int j=i+1;j<left;j++) {
if(arr[j]==value) {
move++;
}else {
break;
}
}
}
for(int k=i;k<left-move;k++) {
arr[k]=arr[k+move];
}
left=left-move;
move=0;
}
}
二、逆向思维,找数组中不是目标值的数据,将他们整合起来成一个数组。
public void delByValue(int value) {
int index=0;
for(int i=0;i<left;i++) {
if(arr[i]!=value) {
arr[index++]=arr[i];
}
}
left=index;
}
利用一个整形变量index,既可以用作数组下标,同时又记录了最后不包含删除目标值的left值,一举两得,方法最为简单且代码量少。
数组数据的查改
因为数组是顺序存储的,所以对于数据的查和改,只需要顺序遍历整个数组,检查是否有所需数据即可,这里不予代码实现。