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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:19:08