从高到低排序文件,保留其他信息
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);
我正在寻找一种能够读取文件并重写同一文件的方法,但要考虑其中的所有信息以从高到低对其进行排序
/*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);