You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从文本文件提取记录并按记录中的日期元素排序?

解决按日期排序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;
    }
});

关键逻辑说明:

  1. 集合选型调整:用ArrayList替代HashSet,保证记录可以被排序和保留原始内容
  2. 日期提取逻辑:
    • 用正则\\d{4}-\\d{2}-\\d{2}匹配标准的年-月-日格式
    • 从行末尾往前查找日期,兼容你文本中记录日期数量不一致的情况
  3. 排序规则:
    • 有日期的记录按日期升序排列
    • 无日期的记录统一放在排序结果的末尾
    • 如需降序,只需修改compare方法里的日期对比顺序
  4. 资源管理:添加reader.close()确保文件流被正确关闭,避免资源浪费

另外,你原代码里两次分割行但未使用结果的问题也被优化,现在分割逻辑统一放到日期提取方法中,更简洁高效。

内容的提问来源于stack exchange,提问作者jayjay275

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:24:37