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

Java实现:如何按分数对文本文件条目进行降序排序

解决HighScores.txt按分数排序的问题

别慌,我来帮你搞定这个排序问题!你的思路方向是对的——读取文件内容到集合里,处理后再写回去就行。咱们一步步来实现:

第一步:定义数据类存储记录(可选但更清晰)

先创建一个简单的类,用来保存每条高分记录的完整文本和对应的分数值,这样排序的时候逻辑更清晰,维护起来也方便:

class ScoreRecord implements Comparable<ScoreRecord> {
    private String fullLine;
    private double score;

    public ScoreRecord(String fullLine, double score) {
        this.fullLine = fullLine;
        this.score = score;
    }

    // 按分数降序排序,分数相同则保留原顺序
    @Override
    public int compareTo(ScoreRecord other) {
        return Double.compare(other.score, this.score);
    }

    public String getFullLine() {
        return fullLine;
    }
}

第二步:实现Check方法的排序逻辑

接下来把排序的核心逻辑写进你的Check()方法里,流程是读取文件→解析分数→排序→覆盖写回文件:

public void Check() throws IOException {
    // 1. 读取所有记录到集合中
    List<ScoreRecord> records = new ArrayList<>();
    File scoreFile = new File("HighScores.txt");
    
    try (Scanner scanner = new Scanner(scoreFile)) {
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine().trim();
            if (line.isEmpty()) continue; // 跳过空行
            
            // 2. 从行文本中提取分数:匹配"Score : "后面的数字(支持小数)
            Pattern scorePattern = Pattern.compile("Score : ([\\d.]+)");
            Matcher matcher = scorePattern.matcher(line);
            if (matcher.find()) {
                double score = Double.parseDouble(matcher.group(1));
                records.add(new ScoreRecord(line, score));
            }
        }
    }

    // 3. 对记录按分数降序排序
    Collections.sort(records);

    // 4. 将排序后的记录写回文件(覆盖原内容)
    try (PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(scoreFile)))) {
        for (ScoreRecord record : records) {
            writer.println(record.getFullLine());
        }
    }
}

关键细节解释

  • 正则表达式提取分数:Score : ([\\d.]+)专门匹配你文件里"Score : "后面的数字(包括小数),确保准确提取分数值,避免解析错误。
  • try-with-resources语法:自动关闭流资源,比手动调用close()更安全,不会因为异常导致资源泄漏。
  • 排序逻辑:ScoreRecord实现了Comparable接口,compareTo方法里用Double.compare(other.score, this.score)实现降序排序,如果需要升序,把两个参数调换位置即可。

替代方案:不用自定义类的简化写法

如果你觉得自定义类麻烦,也可以直接对字符串列表排序,用自定义Comparator处理分数提取:

public void Check() throws IOException {
    List<String> allLines = new ArrayList<>();
    File scoreFile = new File("HighScores.txt");
    
    // 读取所有非空行
    try (Scanner scanner = new Scanner(scoreFile)) {
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine().trim();
            if (!line.isEmpty()) allLines.add(line);
        }
    }

    // 自定义排序规则:提取分数后降序排列
    Collections.sort(allLines, (lineA, lineB) -> {
        double scoreA = getScoreFromLine(lineA);
        double scoreB = getScoreFromLine(lineB);
        return Double.compare(scoreB, scoreA);
    });

    // 写回文件
    try (PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(scoreFile)))) {
        for (String line : allLines) {
            writer.println(line);
        }
    }
}

// 提取分数的工具方法
private double getScoreFromLine(String line) {
    Pattern scorePattern = Pattern.compile("Score : ([\\d.]+)");
    Matcher matcher = scorePattern.matcher(line);
    return matcher.find() ? Double.parseDouble(matcher.group(1)) : 0.0;
}

这样就能完美实现按分数从高到低排序啦!记得测试一下,确保文件路径正确,分数提取逻辑能覆盖所有记录格式~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:51:32