从最高编号到最低编号对文件进行排序,保留其他信息



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

/*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);

很好的问题,这很容易解决。只需将文件读取为表示每行的 String 对象的集合。然后按: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);

最新更新