在披萨点餐场景中,用户需要动态选择配料,并且可以随时移除已经选中的配料,而Java原生的数组长度固定,无法直接删除元素,因此需要采用更灵活的存储结构来实现动态菜单功能。

原生数组的局限性
Java中的原生数组在初始化时就需要确定长度,后续无法修改长度。如果尝试删除数组中的元素,只能通过创建新数组、复制剩余元素的方式实现,效率较低,代码逻辑也比较繁琐。例如下面的原生数组删除元素的示例:
import java.util.Arrays;
public class PizzaArrayDemo {
public static void main(String[] args) {
String[] selectedToppings = {"芝士", "培根", "蘑菇", "青椒"};
String removeTopping = "培根";
// 找到要删除元素的索引
int index = -1;
for (int i = 0; i < selectedToppings.length; i++) {
if (selectedToppings[i].equals(removeTopping)) {
index = i;
break;
}
}
if (index != -1) {
// 创建新数组,长度为原数组长度减1
String[] newToppings = new String[selectedToppings.length - 1];
// 复制删除元素前的部分
System.arraycopy(selectedToppings, 0, newToppings, 0, index);
// 复制删除元素后的部分
System.arraycopy(selectedToppings, index + 1, newToppings, index, selectedToppings.length - index - 1);
selectedToppings = newToppings;
}
System.out.println("删除后的配料:" + Arrays.toString(selectedToppings));
}
}上述代码虽然能实现删除功能,但每次删除都需要创建新数组,且索引查找和数组复制的逻辑都需要手动处理,容易出错,不适合频繁动态操作的场景。
使用ArrayList实现动态菜单
ArrayList是Java集合框架中的动态数组,长度可自动扩容,提供了现成的元素删除方法,非常适合实现披萨配料的动态选择功能。下面是实现完整动态菜单的代码示例:
import java.util.ArrayList;
import java.util.Scanner;
public class PizzaToppingMenu {
public static void main(String[] args) {
// 初始化可选配料列表
ArrayList<String> allToppings = new ArrayList<>();
allToppings.add("芝士");
allToppings.add("培根");
allToppings.add("蘑菇");
allToppings.add("青椒");
allToppings.add("洋葱");
allToppings.add("萨拉米");
// 初始化已选配料列表
ArrayList<String> selectedToppings = new ArrayList<>();
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("===== 披萨配料选择菜单 =====");
System.out.println("1. 查看可选配料");
System.out.println("2. 添加配料");
System.out.println("3. 移除配料");
System.out.println("4. 查看已选配料");
System.out.println("5. 退出");
System.out.print("请输入操作编号:");
int choice = scanner.nextInt();
scanner.nextLine(); // 消耗换行符
switch (choice) {
case 1:
System.out.println("可选配料:" + allToppings);
break;
case 2:
System.out.print("请输入要添加的配料名称:");
String addTopping = scanner.nextLine();
if (allToppings.contains(addTopping) && !selectedToppings.contains(addTopping)) {
selectedToppings.add(addTopping);
System.out.println("添加成功");
} else {
System.out.println("配料不存在或已添加");
}
break;
case 3:
if (selectedToppings.isEmpty()) {
System.out.println("当前没有已选配料");
break;
}
System.out.println("已选配料:" + selectedToppings);
System.out.print("请输入要移除的配料名称:");
String removeTopping = scanner.nextLine();
// 直接调用remove方法删除元素
boolean isRemoved = selectedToppings.remove(removeTopping);
if (isRemoved) {
System.out.println("移除成功");
} else {
System.out.println("未找到该配料");
}
break;
case 4:
System.out.println("当前已选配料:" + selectedToppings);
break;
case 5:
System.out.println("退出程序");
scanner.close();
return;
default:
System.out.println("无效的操作编号");
}
System.out.println();
}
}
}核心逻辑说明
上述代码中,两个ArrayList分别存储所有可选配料和用户已选配料:
- 添加配料时,先校验配料是否在可选列表中,且没有被重复选择,再调用
add方法添加到已选列表 - 移除配料时,直接调用ArrayList的
remove方法,传入要删除的配料名称即可,该方法会自动找到对应元素并删除,不需要手动处理数组复制逻辑 - 菜单通过循环实现多次操作,用户可以反复添加、移除配料,直到选择退出
两种方案对比
通过下表可以直观看到两种实现方式的差异:
| 对比项 | 原生数组 | ArrayList |
|---|---|---|
| 长度灵活性 | 固定,初始化后不可修改 | 动态,自动扩容缩容 |
| 删除元素复杂度 | 高,需要手动创建新数组复制元素 | 低,直接调用remove方法即可 |
| 代码简洁度 | 逻辑繁琐,代码量大 | 逻辑清晰,代码量少 |
| 适用场景 | 元素数量固定、不需要频繁增删的场景 | 元素数量动态变化、需要频繁增删的场景 |
在实际开发中,如果涉及动态元素增删的需求,优先选择ArrayList等动态集合结构,能够大幅提升开发效率,减少出错概率。