如何从文本文件提取记录并按记录中的日期元素排序?
解决按日期排序txt记录的问题
首先,你当前的代码有两个核心问题需要修正:
- 用了
HashSet,这是无序且去重的集合,天然不支持排序操作,得换成ArrayList这类有序列表来存储记录 - 分割每行的逻辑错误:
split("")会把每个字符拆成数组元素,正确的做法是按逗号(兼容逗号后带空格的情况)分割,用split(",\\s*")
下面是修改后的完整代码,我会逐部分解释逻辑:
btnPrintList.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // File path & name Path path = Paths.get(System.getProperty("user.dir")).resolve("vehicle.txt"); try { BufferedReader reader = new BufferedReader(new FileReader(path.toFile())); // 替换HashSet为ArrayList,用来存储所有有效记录 List<String> carsList = new ArrayList<>(); String line = reader.readLine(); while (line != null) { String trimmedLine = line.trim(); System.out.println("processing line: " + trimmedLine); // 跳过空行 if (!trimmedLine.isEmpty()) { carsList.add(trimmedLine); } line = reader.readLine(); } reader.close(); // 记得关闭文件流,避免资源泄漏 // 按日期对记录排序 Collections.sort(carsList, new Comparator<String>() { @Override public int compare(String line1, String line2) { // 提取两行的日期 LocalDate date1 = extractDate(line1); LocalDate date2 = extractDate(line2); // 处理无日期的情况:把没有日期的记录放在排序结果最后 if (date1 == null && date2 == null) { return 0; } else if (date1 == null) { return 1; } else if (date2 == null) { return -1; } // 按日期升序排序,要降序的话改成date2.compareTo(date1) return date1.compareTo(date2); } }); // 输出排序后的结果 System.out.println("===== 排序后的车辆记录 ====="); for (String car : carsList) { System.out.println(car); } } catch (IOException e1) { e1.printStackTrace(); } } // 从行记录中提取日期:从后往前找,优先取符合yyyy-MM-dd格式的字段 private LocalDate extractDate(String line) { String[] parts = line.split(",\\s*"); // 从末尾开始遍历,适配部分行有1个/2个/0个日期的情况 for (int i = parts.length - 1; i >= 0; i--) { String part = parts[i].trim(); // 用正则匹配标准日期格式 if (part.matches("\\d{4}-\\d{2}-\\d{2}")) { try { return LocalDate.parse(part); } catch (DateTimeParseException e) { // 格式不合法就跳过,继续找下一个字段 continue; } } } // 找不到有效日期返回null return null; } });
关键逻辑说明:
- 集合选型调整:用
ArrayList替代HashSet,保证记录可以被排序和保留原始内容 - 日期提取逻辑:
- 用正则
\\d{4}-\\d{2}-\\d{2}匹配标准的年-月-日格式 - 从行末尾往前查找日期,兼容你文本中记录日期数量不一致的情况
- 用正则
- 排序规则:
- 有日期的记录按日期升序排列
- 无日期的记录统一放在排序结果的末尾
- 如需降序,只需修改
compare方法里的日期对比顺序
- 资源管理:添加
reader.close()确保文件流被正确关闭,避免资源浪费
另外,你原代码里两次分割行但未使用结果的问题也被优化,现在分割逻辑统一放到日期提取方法中,更简洁高效。
内容的提问来源于stack exchange,提问作者jayjay275
相关产品推荐
相关产品推荐

