Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按从高到低的顺序排列文件,保留其他信息_Java_File_File Writing - Fatal编程技术网

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