Java中按列排序二维字符串数组的问题(游戏排行榜场景)
搞定游戏排行榜的分数降序排序问题
嘿,我来帮你解决这个排行榜排序的麻烦!你现在用二维数组存用户名和分数,想要按分数从高到低排序对吧?咱们先把整个流程理清楚——先把文件数据正确读到数组里,再搞定排序的核心逻辑,一步一步来。
1. 先把文件数据完整读到二维数组里
我看你已经在写读取文件的代码了,先补全这部分,确保每一行的用户名和分数都能正确放进二维数组:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.Arrays; import java.util.Comparator; public class Leaderboard { public static void main(String[] args) { // 先数清楚文件有多少行,方便创建对应大小的二维数组 int totalUsers = 0; try (BufferedReader countReader = new BufferedReader(new FileReader("scores.txt"))) { while (countReader.readLine() != null) { totalUsers++; } } catch (IOException e) { e.printStackTrace(); } // 创建二维数组:每一行存[用户名, 分数] String[][] scoresArray = new String[totalUsers][2]; try (BufferedReader dataReader = new BufferedReader(new FileReader("scores.txt"))) { String line; int index = 0; while ((line = dataReader.readLine()) != null) { // 假设每行用空格分隔用户名和分数,要是你的文件用逗号或者别的,改这里的分隔符就行 String[] userData = line.split(" "); if (userData.length == 2) { scoresArray[index][0] = userData[0]; // 存用户名 scoresArray[index][1] = userData[1]; // 存分数 index++; } } } catch (IOException e) { e.printStackTrace(); }
2. 核心:按分数降序排序
这里要注意一个坑:不能直接对分数的字符串排序!比如字符串"99"会比"100"大,但实际分数100更高。所以必须把字符串转成数字再比较,用Arrays.sort()加自定义比较器就能实现降序:
// 开始按分数降序排序 Arrays.sort(scoresArray, new Comparator<String[]>() { @Override public int compare(String[] userA, String[] userB) { try { // 把字符串分数转成整数(如果是小数就用Double.parseDouble) int scoreA = Integer.parseInt(userA[1]); int scoreB = Integer.parseInt(userB[1]); // 降序的关键:用B的分数减A的,分数高的排前面 return Integer.compare(scoreB, scoreA); } catch (NumberFormatException e) { // 要是遇到格式错误的分数,就把这条数据排到最后 return 1; } } });
3. 验证排序结果
最后可以打印出来看看效果,确认排序是否正确:
// 打印排序后的排行榜 System.out.println("游戏排行榜(分数从高到低):"); for (String[] user : scoresArray) { System.out.println("用户名:" + user[0] + " | 分数:" + user[1]); } } }
额外小建议:用自定义类代替二维数组
其实二维数组虽然能用,但后续维护起来有点麻烦,推荐用自定义类来存用户信息,代码可读性会高很多:
class UserScore { private String username; private int score; public UserScore(String username, int score) { this.username = username; this.score = score; } // getter方法 public String getUsername() { return username; } public int getScore() { return score; } }
之后读取数据时存到List<UserScore>里,排序更直观:
List<UserScore> userScores = new ArrayList<>(); // 读取文件时添加数据 userScores.add(new UserScore(userData[0], Integer.parseInt(userData[1]))); // 一行代码完成降序排序 userScores.sort((u1, u2) -> Integer.compare(u2.getScore(), u1.getScore()));
这样后续要加用户等级、游戏时间这类字段,扩展起来也方便很多~
内容的提问来源于stack exchange,提问作者user4507861
相关产品推荐
相关产品推荐

