活动地址:CSDN21天学习挑战赛
一、题目:
实现动态的给数组添加元素效果,实现对数组扩容。
1、原始数组使用静态分配int[]àrr={1,2,3}
2、增加的元素,直接放在数组的最后arr={1,2,3,4} arrNew = {1,2,3,4}
3、用户可以通过如下方法来决定是否继续添加,添加成功,是否继续?y/n
二、分析
用到的思想方法:
1、数组的拷贝:数组的赋值赋的是首地址和数组的长度等属性,所以单纯的“数组1 = 数组2”并不能达成目的,所以需要用到数组拷贝的思想:
int arr1 = {1, 2, 3};
int arr2 = new int[arr1.length];
for(int i = 0; i <= length - 1; i++){
arr2[i] = arr1[i];
}
新建一个数组,使新数组长度与旧数组一致
2、new,用法是在内存中取到一处与需要的内存空间大小,并返回该内存空间的大小。
3、java的地址是动态的、内存空间存在自动回收的功能,若某一段地址失去索引,则该内存空间会被回收,空间内的数据会被其他数据覆盖。
4、数组的扩容:取一个新数组,长度为旧数组的长度+1,将旧数组的数据“拷贝”进新数组,并将需要扩容新元素赋值到新数组的末位。将新数组的地址赋值给旧数组。
注:①如此,旧数组的地址就会被新的地址覆盖,成为一个新的,长度比原来多了1,元素除新增元素外与原数组相同的新数组。②由于3的存在,旧数组的旧地址若再无其他索引就会被回收,数据很快会被覆盖消失。
int[] arr1 = {1, 2, 3};
int[] newarr = new int[arr1.length + 1];
for(int i = 0; i <= newarr.length - 2; i++) {
newarr[i] = arr1[i];
}
newarr[newarr.length - 1] = 4;
arr1 = newarr;
5、循环(略):判断是否输入了y,输入了继续循环,反之退出循环。
可以使用do while,也可以采用while。
三、设计
* 设计思路:
* 1、设计一个扩容数组* 2、在扩容数组的基础上,增加一个输入功能,将新输入的元素编入新数组的末位
* 3、在扩容功能模块外,加入一个循环语句:
* 循环节:(input == 'y')
* 并再添加一个输入功能,将输入赋值给input。
四、代码
import java.util.Scanner;
public class ArrayAddPro {
public static void main(String[] arg) {
Scanner sc = new Scanner(System.in);//监听器
int[] arr1 = {1, 2, 3};
char input = 'y';
while(input == 'y') { //循环节
int[] newarr = new int[arr1.length+1];//更新newarr数组的地址
System.out.println("请输入你要添加的元素");
int nextdata = sc.nextInt(); //输入添加的元素
for(int i = 0; i <= newarr.length - 2; i++) {
newarr[i] = arr1[i];//数组拷贝
}
newarr[newarr.length - 1] = nextdata;
arr1 = newarr;
System.out.println("扩容后的数组:");
for(int j = 0; j <= arr1.length - 1; j++) {
System.out.print(arr1[j]+"\t");
}
System.out.println("是否继续输入(y/n):");
input = sc.next().charAt(0);
}
}
}
五、拓展:
为程序增加新功能:例如数组倒置和数组缩减或指定添加元素的位置等。
1、数组倒置:将第i个和第n-1-i个元素交换,i+1,并重复上述过程。直到i = n-1-i;
private static void ArrReverse() {
int[] arr1 = new int[10];
for(int i = 0; i < arr1.length; i++) {
arr1[i] = i;
}
for(int i = 0; i < (arr1.length / 2); i++){
int temp = arr1[i];
arr1[i] = arr1[arr1.length-i-1];
arr1[arr1.length-i-1] = temp;
}
for(int i = 0; i< arr1.length; i++) {
System.out.println(arr1[i]);
}
}
2、数组的缩减:可以理解为数组扩容的逆过程。
private static void ArrSub() {
int[] arr1 = new int[10];
for(int i = 0; i < arr1.length; i++) {
arr1[i] = i;
}
char f;
do {
int[] arrNew = new int[arr1.length-1];
for(int i = 0; i < arrNew.length; i++) {
arrNew[i] = arr1[i];
}
arr1 = arrNew;
System.out.println("数组更新完毕");
for(int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
System.out.println("是否继续缩减数组");
Scanner sc = new Scanner(System.in);
f = sc.next().charAt(0);
if(arr1.length == 1) {
System.out.println("不能再继续缩减了");
break;
}
}while(f == 'y');
}
3、自定义添加元素的位置:设置一个新的分支函数,添加位置前的b[i] = a[i],之后b[i] = a[i+],
该位置上b[k] = newdata。