Java如何实现按用户选择从CSV多行字符串中提取指定行存储逗号分隔值
CSV车辆选择功能代码补全方案
实现思路
你现有代码已经完成了CSV文件加载的基础逻辑,只需要补充三个核心模块即可满足需求:
- 读取CSV行数据时,提取每行首列的车辆编号,将编号和对应车辆字段做键值映射存储,方便后续快速匹配
- 增加控制台输入交互逻辑,做双层校验:既判断输入是否为合法整数,也判断整数是否落在1-5的有效区间,避免非法输入导致程序崩溃
- 拿到合法的用户输入编号后,直接从映射存储中取出对应车辆数据留存即可
补全后完整代码
import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class CarBooking { public static void carSelection() throws IOException{ String CSVFileName = "CarList.csv"; File file = new File(CSVFileName); // 存储车辆编号和对应车辆数据的映射 Map<Integer, String[]> carDataMap = new HashMap<>(); System.out.println("To make a booking:"); System.out.println(" Select the car number from the car list"); try { Scanner fileScanner = new Scanner(file); // 逐行读取CSV,存入映射表 while (fileScanner.hasNextLine()) { String line = fileScanner.nextLine(); // 跳过空行避免解析报错 if (line.isBlank()) continue; // 按逗号拆分每行字段,trim处理字段前后多余空格 String[] carInfo = line.split(","); for (int i = 0; i < carInfo.length; i++) { carInfo[i] = carInfo[i].trim(); } Integer carId = Integer.parseInt(carInfo[0]); carDataMap.put(carId, carInfo); // 读取时直接打印车辆列表,方便用户选择 System.out.printf("编号%d:%s %s座 %s %s配置 日租价$%s%n", carId, carInfo[1], carInfo[2], carInfo[3], carInfo[4], carInfo[5]); } fileScanner.close(); } catch (FileNotFoundException e) { e.printStackTrace(); return; } // 交互获取用户合法输入 Scanner inputScanner = new Scanner(System.in); int selectedCarId = -1; while (selectedCarId < 1 || selectedCarId > 5) { System.out.print("请输入1-5范围内的车辆编号完成选择:"); // 判断输入是否为整数 if (inputScanner.hasNextInt()) { selectedCarId = inputScanner.nextInt(); if (selectedCarId <1 || selectedCarId >5) { System.out.println("输入超出范围,请重新输入"); } } else { System.out.println("输入无效,请输入整数类型的车辆编号"); // 清空无效输入的缓冲区 inputScanner.next(); } } inputScanner.close(); // 取出用户选中的车辆数据存储,后续可直接调用该变量做业务逻辑 String[] selectedCar = carDataMap.get(selectedCarId); // 打印选中结果确认 System.out.printf("已选中车辆:%s,日租价格$%s%n", selectedCar[1], selectedCar[5]); } }
注意事项
- 拆分CSV字段后统一做
trim()处理,适配示例数据里Automatic这类字段尾部带多余空格的情况,避免后续匹配配置类型时因为空格出错 - 读取文件的Scanner和接收控制台输入的Scanner分开实例化,避免流冲突
- 输入校验环节必须处理非整数输入的场景,否则用户输入字母、符号时程序会直接抛出异常终止
内容的提问来源于stack exchange,提问作者BigO
相关产品推荐
相关产品推荐

