java:数组扩容程序

​活动地址: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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值