我正在尝试创建一个方法,它从我的.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文件并终止程序。有没有人知道我在语法上或逻辑上做错了什么?
答案 0 :(得分:0)
您的代码中有几个问题:
您声明BufferedReader buffer = new BufferedReader(reader);
但从未使用buffer
来阅读数据,而是使用Scanner input
。
Scanner input = new Scanner ("Grades.txt");
使用Scanner(String)
,这意味着它将使用String
参数作为源来读取数据。您应该将其作为File
传递,如下所示:
Scanner input = new Scanner(new File("Grades.txt"));
您正在创建一个输入文件,其输入文件的名称和路径相同,如下所示:
FileWriter fileWriter = new FileWriter("Grades.txt");
为此文件使用其他名称和位置,例如:
FileWriter fileWriter = new FileWriter("Grades-out.txt");
如果您希望/需要追加数据到输出的末尾,请使用FileWriter(String, boolean)
并将第二个参数作为true
传递。
FileWriter fileWriter = new FileWriter("Grades-out.txt");
请注意,使用此方法时,必须在执行应用程序之前手动清除文件,否则输入中可能会有重复数据。
从2开始,由于您还没有从double
字符串中读取任何"Gradex.txt"
,因此文件中没有输出,因此当前输出文件为Grades .txt,将是一个空文件。
我建议您创建一个名为Person
的类,其中存储名称字符串和双精度(无论它意味着什么),然后将Person
的每个实例存储在{{1}中(由List<Person>
支持)并使用自定义ArrayList<Person>
或在Comparator<Person>
类中实施Comparable<Person>
对此列表进行排序。
答案 1 :(得分:0)
你可以使用这样的东西(我总是使用charset进行阅读,如果你不需要它只是不使用它):
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...