如何通过Scanner从控制台选择已创建对象添加至ArrayList?
解决方案:通过控制台选择已创建的Car实例添加到集合
Scanner本身没有nextCar()这类读取自定义对象的方法,因为它仅支持Java标准数据类型的读取。要实现需求,核心思路是通过用户输入的标识(数字/字符串)映射到已创建的Car实例,以下是两种可行方案:
方案一:数字选择映射
给每个已创建的Car实例分配唯一数字标识,读取用户输入的数字后,通过条件判断匹配对应实例并添加到集合。
示例代码
首先定义简单的Car类:
class Car { private String model; public Car(String model) { this.model = model; } @Override public String toString() { return "Car{model='" + model + "'}"; } }
主程序实现:
import java.util.ArrayList; import java.util.Scanner; public class CarCollectionDemo { public static void main(String[] args) { // 已创建的Car实例 Car c1 = new Car("Model A"); Car c2 = new Car("Model B"); Car c3 = new Car("Model C"); ArrayList<Car> carList = new ArrayList<>(); carList.add(c1); carList.add(c2); Scanner input = new Scanner(System.in); // 提示用户选择 System.out.println("请选择要添加的Car实例(输入对应数字):"); System.out.println("1 - c1 (Model A)"); System.out.println("2 - c2 (Model B)"); System.out.println("3 - c3 (Model C)"); int choice = input.nextInt(); input.nextLine(); // 清除输入缓冲区的换行符 // 根据选择添加实例,可选去重判断 switch (choice) { case 1: addIfNotExists(carList, c1); break; case 2: addIfNotExists(carList, c2); break; case 3: addIfNotExists(carList, c3); break; default: System.out.println("无效选择"); } // 验证集合内容 System.out.println("\n当前集合中的Car实例:"); carList.forEach(System.out::println); input.close(); } // 工具方法:避免重复添加 private static void addIfNotExists(ArrayList<Car> list, Car car) { if (!list.contains(car)) { list.add(car); System.out.println("已添加实例:" + car); } else { System.out.println("实例已存在于集合中"); } } }
方案二:实例名称字符串映射
如果希望用户输入实例名(如"c3")来选择,可以用HashMap建立实例名称到对象的映射关系,读取用户输入的字符串后直接从Map中取出对应实例。
示例代码
import java.util.ArrayList; import java.util.HashMap; import java.util.Scanner; public class CarCollectionDemo { public static void main(String[] args) { Car c1 = new Car("Model A"); Car c2 = new Car("Model B"); Car c3 = new Car("Model C"); ArrayList<Car> carList = new ArrayList<>(); carList.add(c1); carList.add(c2); // 建立实例名称与对象的映射 HashMap<String, Car> carMap = new HashMap<>(); carMap.put("c1", c1); carMap.put("c2", c2); carMap.put("c3", c3); Scanner input = new Scanner(System.in); System.out.println("请输入要添加的Car实例名称(如c3):"); String choice = input.nextLine(); if (carMap.containsKey(choice)) { Car selectedCar = carMap.get(choice); addIfNotExists(carList, selectedCar); } else { System.out.println("不存在该实例"); } // 验证集合内容 System.out.println("\n当前集合中的Car实例:"); carList.forEach(System.out::println); input.close(); } private static void addIfNotExists(ArrayList<Car> list, Car car) { if (!list.contains(car)) { list.add(car); System.out.println("已添加实例:" + car); } else { System.out.println("实例已存在于集合中"); } } }
核心说明
Scanner无法直接读取自定义类对象,必须通过中间标识将用户输入和已存在的对象关联起来。两种方案的本质都是通过映射关系,把用户输入转化为对已有Car实例的引用,进而完成添加操作。
内容的提问来源于stack exchange,提问作者Nicolás Ortega Muñoz
相关产品推荐
相关产品推荐

