示例:有一组学生的成绩是{99,85,82,63,60},将它们按降序排列,保存在一个数组中。现需要增加一个学生的成绩,将它插入数组,并保持成绩降序排列
package array;
import java.util.Scanner;
public class Insert {
public static void main(String[] args) {
//定义数组
int[] arrs = {99,85,82,63,60};//静态初始化数组
Scanner sc = new Scanner(System.in);
System.out.println("请输入新增成绩:");
int newScore = sc.nextInt();
//找到插入位置
int index = 0;
for(int i = 0;i < arrs.length;i++){
if(arrs[i] < newScore){
index = i;
break;
}
}
//插入新元素并调整数组
System.out.println("插入成绩的下标是:" + index);
int[] newArrs = new int[arrs.length + 1];//动态初始化数组
System.arraycopy(arrs,0,newArrs,0,index);
newArrs[index] = newScore;
System.arraycopy(arrs,index,newArrs,index + 1,arrs.length - index);
//输出调整后的数组
System.out.println("插入后的成绩信息是:");
for(int i = 0;i < newArrs.length;i++){
System.out.println(newArrs[i]);
}
}
}
运行结果:
这个代码的思想是:首先,定义一个示例数组arrs,然后通过Scanner类获取用户输入的新成绩newScore。接着,我们通过循环找到新元素newScore应该插入的位置index,(其中,因为给定的数组是降序排列,并且要求插入新元素后的数组仍保持降序排列,所以我们先要用if判断,找出数组中比newScore小的元素的位置即其下标i,把i的值赋值给index,就是newScore应该插入的位置,当找到这个位置之后用break跳出循环)如:
最后,我们将新数组newArrs这个新数组复制出来,(我们运用System.arraycopy()方法对数组进行深拷贝的操作,具体来说,代码的意义如下:
1.System.arraycopy(nums,0,newNums,0,index)
从nums数组的第一个元素(索引为 0)开始,复制到newNums数组的第一个元素(索引为 0),复制的元素数量为index。也就是说,将nums数组的前index个元素复制到newNums数组的前index个元素。
2.newNums[index] = newScore:将新输入的分数newScore赋值给newNums数组的第index个元素。
3.System.arraycopy(nums,index,newNums,index + 1,nums.length - index)
从nums数组的第index个元素开始,复制到newNums数组的第index + 1个元素开始,复制的元素数量为nums.length - index。也就是说,将nums数组中从第index个元素开始的剩余元素复制到newNums数组中从第index + 1个元素开始的剩余元素。
这样,newNums数组就包含了nums数组的所有元素,并且新插入的元素在正确的位置。同时,由于System.arraycopy()方法是深拷贝,新数组中的元素都是原数组中的元素的副本,而不是引用。因此,对newNums数组中的元素进行修改不会影响到nums数组。)
将新成绩插入到指定位置,并输出结果。这样就可以实现插入新元素并保持降序排列。
Ps:本人也是刚学习java,也刚好学到数组这里,解释的多的地方(比如找到插入位置,以及System.arraycopy()数组的复制,也是我查阅资料,对着那些资料思考了很久,理解了很久,然后用自己的理解写出来的,学编程语言就是这样,可能会遇到遇到许多不理解的地方,但一定要坚持去理解,多去想想,一定能想通过的)。希望各位看完后都能理解吧,不理解的地方也可以和我交流哦,我们互相进步。(我也是Java小白,如果有大佬看到我有解释不正确的地方,欢迎和我说哦)