Java中如何检查String数组重复值 加载CSV时校验重复ID并抛异常
实现方案
你需要一个Set集合存储已经读取过的questionID,利用Set自带的去重特性和contains()方法就能快速完成重复校验,具体修改如下:
核心逻辑说明
- 在循环读取CSV行之前初始化一个
HashSet<String>,用来存储已出现的题目ID,推荐用HashSet而非List做存储,因为HashSet的contains()查询时间复杂度为O(1),数据量较大时效率远高于List的O(n)遍历查询 - 每次解析得到当前行的questionID后,先调用
set.contains(questionID)判断是否已存在- 存在则直接抛出异常
- 不存在则将当前ID存入Set,继续执行后续校验逻辑
- 额外注意:你现有代码的校验顺序有问题,需要先校验split后的数组长度,再按下标取对应字段,否则会触发数组越界异常
修改后完整代码
import java.util.HashSet; import java.util.Scanner; import java.util.Set; import java.io.FileInputStream; import java.io.FileNotFoundException; // 类定义省略 public void loadTrueFalseQuestions() throws Exception { try { Scanner input = new Scanner(new FileInputStream(TRUE_FALSE_FILE)); // 新增:存储已出现的questionID Set<String> existedQuestionIds = new HashSet<>(); while (input.hasNextLine()) { String line = input.nextLine(); String[] split = line.split(","); // 先校验字段数量,避免数组越界 if (split.length != TRUE_FALSE_FIELDS) { throw new Exception("CSV字段数量不匹配"); } // 校验通过再取对应字段值 String questionID = split[0]; // 重复校验逻辑 if (existedQuestionIds.contains(questionID)) { throw new Exception("发现重复的题目ID:" + questionID); } // 校验通过存入集合 existedQuestionIds.add(questionID); int chapterNumber = Integer.parseInt(split[1]); String correctAnswer = split[3]; // 答案合法性校验,用equals比matches更高效,逻辑与改用短路&& if (!correctAnswer.equals("TRUE") && !correctAnswer.equals("FALSE")) { throw new Exception("题目ID" + questionID + "的答案值不合法:" + correctAnswer); } // 后续业务逻辑省略 } input.close(); // 不要忘记关闭IO资源 } catch (FileNotFoundException e) { System.out.println("Could not open a file."); System.exit(0); } }
内容的提问来源于stack exchange,提问作者Zenith2k3
相关产品推荐
相关产品推荐

