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
相关产品推荐
相关产品推荐

