首页 > 解决方案 > JavaFX 排序文本文件输出

问题描述

我是一名学生,目前正在学习 Java。我们必须为下一学年做一个编程项目,几天前我开始做我的项目,所以我有足够的时间来完成它。我想为我的游戏制作排行榜。当你死后会弹出一个小屏幕,你可以在其中输入你的名字,然后你的名字+你的分数将保存在一个文本文件中。现在,因为它是一个排行榜,我必须将它从最高分到最低分进行排序。我有点(也许)知道如何只用整数对其进行排序,但这是一个带有额外名称而不是 int 的字符串,所以你知道谁得分了。有谁知道如何做到这一点?

文本文件如下所示:

Max Mustermann - 10000
Max Muster - 40000
John Smith - 80000
Iam Uncreative - 20000

我当前读取文件的代码:(我正在使用 JavaFX 顺便说一句)

try {
   BufferedReader br = new BufferedReader( new FileReader( file ) );

   String x;
   while ( ( x = br.readLine() ) != null ) {
      String s = tLB.getText();
      tLB.setText( s + "\n" + x );
   }
} catch(Exception E) {
   System.out.println( "cant read leaderboard" );
}

我还没有代码可以保存到文件中,因为我的项目还没有那么远。只想从文本文件中对一些手动保存的字符串进行排序

我将不胜感激任何形式的帮助 :) 对不起我的语法错误

标签: javasortingjavafx

解决方案


我会创建一个类来保存排行榜中的每个领导者,如下所示:

    static class LeaderBoardEntry implements Comparable {
    String name;
    int score;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    @Override
    public int compareTo(Object o) {
        return ((LeaderBoardEntry) o).score - this.score;
    }
}

在这里实现 Comparable 接口允许我们比较领导者以根据他们的分数获得自然排序。

接下来,我将修改您的代码,如下所示,以便显示已排序的排行榜,

try {
        BufferedReader br = new BufferedReader(new FileReader(file));

        List<LeaderBoardEntry> leaders = new ArrayList<>();

        String x;
        while ((x = br.readLine()) != null) {
            LeaderBoardEntry leaderBoardEntry = new LeaderBoardEntry();
            String[] splits = x.split(" - ");
            leaderBoardEntry.setName(splits[0]);
            leaderBoardEntry.setScore(Integer.parseInt(splits[1]));
            leaders.add(leaderBoardEntry);
        }


        Collections.sort(leaders);

        StringBuilder leaderBoardStr = new StringBuilder();

        for (LeaderBoardEntry leaderBoardEntry : leaders) {
            leaderBoardStr.append(leaderBoardEntry.getName())
                    .append(" - ")
                    .append(leaderBoardEntry.getScore())
                    .append("\n");
        }

        String s = tLB.getText();
        tLB.setText( s + "\n" + leaderBoardStr.toString());

    } catch (Exception E) {
        System.out.println("cant read leaderboard");
    }

推荐阅读