Java 按从高到低的顺序排列文件,保留其他信息
我正在寻找一种方法,能够读取一个文件并重写同一个文件,但要考虑其中的所有信息,从最高到最低排序Java 按从高到低的顺序排列文件,保留其他信息,java,file,file-writing,Java,File,File Writing,我正在寻找一种方法,能够读取一个文件并重写同一个文件,但要考虑其中的所有信息,从最高到最低排序 /*Scores*/ Mathew: 540 Stacy: 070 Andre: 761 Alfred: 340 这就是我在.txt文件中的编写方式,我希望它是: /*Scores*/ Andre: 761 Mathew: 540 Alfred: 340 Stacy: 070 我正在为每个级别编写文件,方法如下: public void scoreWrite(int
/*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<Integer, String> map = new TreeMap<>();
map.put(540, "Mathew");
map.put(070, "Stacy");
以下是通过读取一个文件并写入另一个文件来实现此目的的方法:
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);
Path Path=Paths.get(“Scoreboard/Level_0;”+levelID+“Highscore.txt”);
String save=Files.readAllLines(path).stream()//从输入文件流式处理所有行
.map(s->map.entry(Integer.parseInt(s.split(“:”[1])、s.split(“:”[0].strip())//拆分并映射到map.entry
.sorted(Map.Entry.comparingByKey())//排序
.map(entry->entry.getValue()+“:“+entry.getKey())//映射到所需格式
.collect(收集器.加入(“\n”);//收回字符串
Files.writeString(Highscores.toPath(),save);
这是一个很好的问题,很容易解决。只需将文件读取为代表每行的字符串对象的集合。然后用:
或空格
字符分割该行,并获得分数值,然后根据该值进行比较。然后,通过连接这些值,您可以简单地映射回字符串列表。然后可以使用文件进行写入。写入
Path Path=Paths.get(“Scoreboard/Level_0;”+levelID+“Highscore.txt”);
列表行=文件。readAllLines(路径);
List linesOrdered=lines.stream()
.map(行->行.replaceAll(“,”).split(“:”)
.sorted(Comparator.comparingInt(strings->Integer.parseInt(strings[1]))
.map(值->字符串.join(“,值))
.collect(Collectors.toList());
写入(路径、行排序);
制作一个包含玩家姓名和分数的HighScore类,制作一个HighScore数组,用HighScore填充,然后在数组中排序,然后写入文件。要对它们进行排序,您可以实现Comparable接口和您自己的compareTo,这是一个比较分数的接口。每当我测试这个接口时,它会在线程“thread-0”java.lang.ArrayIndexOutOfBoundsException中给我一个:异常:索引1超出长度1的界限,并指向此行:。排序(Comparator.comparingInt)(String->Integer.parseInt(strings[1]))现在,我在重写代码之前总是试图理解它,但是如果你能解释一下你的代码,我会很感激的!当你说使用SortedMap时,我想你的意思是制作一个接口,如果是的话,当我这样做的时候,我是否也应该添加名称?(就像你代码的第一个片段)因为这些名字除了即将出现的.txt文件之外没有存储在任何地方,也没有存储在内存中,因为我只有一个部分可以让人插入名字并将其作为字符串保存。我尝试使用你的代码,但出于某种原因,当我制作界面并粘贴代码时,它不喜欢它(只是为了看看它是如何工作的)
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);