JavaFX Sort文本文件输出

时间:2018-07-10 15:40:04

标签: java sorting javafx

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

文本文件如下:

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

我当前读取文件的代码:(我正在使用JavaFX btw)

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" );
}

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

我将不胜感激:) 抱歉我的语法不好

2 个答案:

答案 0 :(得分:0)

我将创建一个类来容纳排行榜中的每个领导者,如下所示:

    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");
    }

答案 1 :(得分:0)

与所有中等复杂的CS问题一样,您需要将其分解为单独的问题:

  1. 从文件中读取行。
  2. 排序行。
  3. 将已排序的行汇总到一个字符串中。

类似以下的方法将起作用:

private static final Pattern PATTERN = Pattern.compile("\\d+$");
public static void main(String[] pArgs) throws IOException {
  try (Stream<String> stream = Files.lines(Paths.get("file.txt"))) {
    System.out.println(
      stream.sorted(
        Comparator.comparing(
          pLine -> {
            final Matcher matcher = PATTERN.matcher(pLine);
            matcher.find();
            return Integer.parseInt(matcher.group(0));
          }
        )
      ).collect(Collectors.joining("\n"))
    );
  }
}