Java 程序在尝试对双精度排序时终止

Java 程序在尝试对双精度排序时终止,java,Java,我正在尝试创建一个方法,在该方法中,它从我的.txt文件中读取两倍的内容,如下所示: Homer Simpson, 50.0 Zoidberg, 100 Peter Griffin, 34.0 Lisa Simpson, 100 然后按降序排列,下面是我的代码: public static void sortGrade() throws IOException { FileReader reader = new FileReader("Grades.txt"); Buffere

我正在尝试创建一个方法,在该方法中,它从我的.txt文件中读取两倍的内容,如下所示:

Homer Simpson, 50.0
Zoidberg, 100
Peter Griffin, 34.0
Lisa Simpson, 100
然后按降序排列,下面是我的代码:

public static void sortGrade() throws IOException {
    FileReader reader = new FileReader("Grades.txt");
    BufferedReader buffer = new BufferedReader(reader);
    Scanner input = new Scanner ("Grades.txt");
    Double dGrade=0.0;
    ArrayList<Double> grade = new ArrayList<Double>();

        while (input.hasNextDouble()) 
        {
            grade.add(dGrade);
        }
    reader.close();
    Collections.sort(grade, Collections.reverseOrder());
    FileWriter fileWriter = new FileWriter("Grades.txt");
    PrintWriter out = new PrintWriter(fileWriter);
    for (Double outputLine : grade) 
    {
        out.println(outputLine);
    }

    out.close();
    }
}

调用该方法后,它会删除我的.txt文件并终止程序。有人知道我在语法或逻辑上犯了什么错误吗?

您的代码中有几个问题:

您声明BufferedReader buffer=new BufferedReaderreader;但永远不要使用缓冲区读取数据,而是使用扫描仪输入

扫描仪输入=new Scanner Grades.txt;使用,这意味着它将使用字符串参数作为读取数据的源。您应该将其作为文件传递,如下所示:

Scanner input = new Scanner(new File("Grades.txt"));
您正在创建一个与输入文件具有相同名称和路径的输出文件,如下所示:

FileWriter fileWriter = new FileWriter("Grades.txt");
为此文件使用不同的名称和位置,如:

FileWriter fileWriter = new FileWriter("Grades-out.txt");
如果希望/需要将数据追加到输出的末尾,则使用第二个参数并将其作为true传递

请注意,使用此方法时,必须在执行应用程序之前手动清除文件,否则输入中可能存在重复数据

从2开始,由于您没有从Gradex.txt字符串中读取任何double,因此文件中没有输出,因此当前输出文件Grades.txt将是一个空文件

我建议您创建一个名为Person的类,在该类中存储名称字符串和double,然后将Person的每个实例存储在由ArrayList支持的列表中,并通过实现Comparable in Person类,使用自定义比较器对该列表进行排序


你可以用这样的东西,我总是用一个字符集来阅读,如果你不需要它,就不要用它:

List<Double> result = new LinkedList<>();

try (Scanner scanner = new Scanner(Paths.get("Grades.txt"), StandardCharsets.UTF_8.name())) {
  while (scanner.hasNextLine()) {
    result.add(Double.valueOf(scanner.nextLine().split(",")[1]));
  }
} catch (IOException e) {
  System.err.printf("Something happened here...this is why: %s", e);
}
Collections.sort(result, Collections.reverseOrder());
// Do your other stuff from now on...

输入读取的第一件事是字符串,而不是双精度,因此第一个while循环将在不做任何操作的情况下终止。我有相同的输出文件,因为我想用排序后的版本覆盖上一个文件。所以第一个标记是字符串而不是双精度,并且“hasNextDouble”返回false不是问题?可能是备注2.5:-。@ph0bolus为您的古怪要求添加了一个解决方案,并添加了一个说明,说明小心操作。@Tom这在第5部分中有所涉及。
List<Double> result = new LinkedList<>();

try (Scanner scanner = new Scanner(Paths.get("Grades.txt"), StandardCharsets.UTF_8.name())) {
  while (scanner.hasNextLine()) {
    result.add(Double.valueOf(scanner.nextLine().split(",")[1]));
  }
} catch (IOException e) {
  System.err.printf("Something happened here...this is why: %s", e);
}
Collections.sort(result, Collections.reverseOrder());
// Do your other stuff from now on...