数组扩容与缩减
动态扩容
思路分析
(1)创建新数组
(2)for 循环遍历旧数组,完成数组拷贝
(3)接收添加元素,遍历新数组,完成添加
注意:多次录入难免在输入缓冲区遗留回车,需要即时清除,避免因为误读缓冲区中的回车导致程序崩溃
java
public class Main {
public static void main(String[] args) {
// 定义原数组
int[] a = {1, 2, 3};
// 创建扫描器
Scanner scanner = new Scanner(System.in);
// 接收扩容个数
System.out.print("请输入需要添加的元素个数:");
int num = scanner.nextInt();
// 清空输入缓冲区(回车)
scanner.nextLine();
// 创建新数组
int[] b = new int[a.length + num];
// 拷贝原数组
for (int i = 0; i < a.length; i++) {
b[i] = a[i];
}
// 接收扩容元素(多个元素时默认以一个空格间隔)
System.out.print("请输入需要添加的元素:");
String[] s = scanner.nextLine().split(" ");
for (int i = 0; i < num; i++) {
// 添加新元素
b[a.length + i] = Integer.parseInt(s[i]);
}
// 打印测试
for (int i : b) {
System.out.print(i + " ");
}
}
}缩减
默认每次缩减一个元素,每一次询问用户是否缩减,当缩减至只剩余一个元素时,提示用户不能缩减
java
public class Main {
public static void main(String[] args) {
// 创建 Scanner 对象,用于接收用户输入
Scanner input = new Scanner(System.in);
// 初始化原始数组
int[] a = {1, 2, 3};
// 定义计数器,用于记录当前数组的长度
int cnt;
// 使用 do...while 循环结构,确保至少执行一次
do {
// 提示用户是否继续缩减数组
System.out.println("是否还要继续缩减元素?输入 y / n ");
// 获取用户输入的第一个字符
char judge = input.next().charAt(0);
// 如果用户输入 'n',则停止缩减并输出最终数组状态
if ('n' == judge) {
System.out.println("停止缩减,最终数组状态如下:");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
break; // 结束循环
}
// 如果用户继续缩减,则创建一个新数组,大小比原数组小1
int[] b = new int[a.length - 1];
// 将 a 数组的内容拷贝到 b 数组
for (int i = 0; i < a.length - 1; i++) {
b[i] = a[i];
}
// 将 a 指向缩减后的数组 b
a = b;
// 输出缩减后的数组
System.out.println("缩减后的数组如下:");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
// 记录缩减后的数组长度
cnt = a.length;
// 输出一个换行符
System.out.println("");
// 如果数组只剩下一个元素,则输出提示并结束程序
if (cnt == 1) {
System.out.print("程序结束,数组剩下最后一个元素,不再缩减");
break;
}
} while (true); // 循环条件永远为 true,直到通过 break 结束
}
}