从高到低排序文件,保留其他信息

Ordering a File from highest number to lowest, retaining the other information

我正在寻找一种能够读取文件并重写同一文件的方法,但要考虑其中的所有信息以从高到低对其进行排序

/*Scores*/
    Mathew: 540
    Stacy: 070
    Andre: 761
    Alfred: 340

我的 .txt 文件就是这样写的,我希望它是:

/*Scores*/
Andre: 761
Mathew: 540
Alfred: 340
Stacy: 070

我正在为每个级别编写文件,方式如下:

public void scoreWrite(int levelID) throws IOException {
    File Highscores = new File("Scoreboard/Level_" + levelID + "_Highscore.txt");
    //      Level_0_Highscore.txt

    if(Highscores.createNewFile()) {
        FileWriter highscoreWriter = new FileWriter(Highscores, false);
        highscoreWriter.write("/*---Highscores---*/ \n \n");
        highscoreWriter.write(SokobanGame.getInstance().getPlayerName()+ "'s " + "score: " + getScore() + " points;\n");
        highscoreWriter.close();
    }else {
        Highscores = new File("Scoreboard/Level_" + levelID + "_Highscore.txt");
        FileWriter highscoreWriter = new FileWriter(Highscores, true);
        highscoreWriter.write(SokobanGame.getInstance().getPlayerName()+ "'s " + "score: " + getScore() + " points;\n");
        highscoreWriter.close();
    }
}

但是现在对于订购方式,我完全不知所措...任何帮助将不胜感激!

您可以使用 SortedMap 简化它。首先创建一个SortedMap:

SortedMap<Integer, String> map = new TreeMap<>();
map.put(540, "Mathew");
map.put(070, "Stacy");

现在在方法中:

File Highscores = new File("Scoreboard/Level_" + levelID + "_Highscore.txt");

String save = map.entrySet().stream() // stream over map
        .map(s -> s.getValue() + ": " + s.getKey()) // map to required format
        .collect(Collectors.joining("\n")); // join the elements

Files.writeString(Highscores.toPath(), save);

这是通过读取一个文件并写入另一个文件来实现的方法:

Path path = Paths.get("Scoreboard/Level_" + levelID + "_Highscore.txt");

String save = Files.readAllLines(path).stream() // stream all lines from input file
        .map(s -> Map.entry(Integer.parseInt(s.split(": ")[1]), s.split(": ")[0].strip())) // split and map to Map.Entry
        .sorted(Map.Entry.<Integer, String>comparingByKey()) // sort
        .map(entry -> entry.getValue() + ": " + entry.getKey()) // map to required format
        .collect(Collectors.joining("\n")); // collect back to string

Files.writeString(Highscores.toPath(), save);

好问题,这很容易解决。只需将文件读取为代表每一行的字符串对象的集合。然后用 :whitespace 字符拆分行并获取分数值并据此进行比较。然后您可以通过连接值简单地映射回字符串列表。然后你可以使用 Files.write!

来写
Path path = Paths.get("Scoreboard/Level_" + levelID + "_Highscore.txt");

List<String> lines = Files.readAllLines(path);

        List<String> linesOrdered = lines.stream()
                .map(line -> line.replaceAll(" ", "").split(":"))
                .sorted(Comparator.comparingInt(strings -> Integer.parseInt(strings[1])))
                .map(values -> String.join(" ", values))
                .collect(Collectors.toList());

Files.write(path, linesOrdered);