2015-04-01 2 views
0

Я пытаюсь создать метод, где он читает двойники из моего текстового файла, который выглядит как:Программы завершается при попытке отсортировать двойники

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

Первое, что 'input' reads - это строка, а не double, поэтому первый цикл while завершится без каких-либо действий. –

ответ

0

У вас есть несколько проблем в вашем коде:

  1. Вы объявляете BufferedReader buffer = new BufferedReader(reader); но не используют buffer для чтения данных, вместо того, чтобы использовать Scanner input.

  2. Scanner input = new Scanner ("Grades.txt"); использует Scanner(String), что означает, что он будет использовать параметр String в качестве источника для считывания данных. Вы должны передать его как File вместо этого, как это:

    Scanner input = new Scanner(new File("Grades.txt")); 
    
  3. Вы создаете выходной файл с таким же именем и путем входного файла, отметил здесь:

    FileWriter fileWriter = new FileWriter("Grades.txt"); 
    

    Используйте другое имя и расположение для этого файла, как:

    FileWriter fileWriter = new FileWriter("Grades-out.txt"); 
    

    в случае, если вы хотите/потребность в добавить данных к концу outpu t, затем используйте FileWriter(String, boolean) и передайте второй параметр как true.

    FileWriter fileWriter = new FileWriter("Grades-out.txt"); 
    

    Имейте в виду, что при использовании этого подхода вы должны вручную удалить файл перед выполнением приложения, в противном случае вы можете дублировать данные в вашем входе.

  4. От 2, так как вы не читали double от "Gradex.txt" строки, то в файле нет выхода, поэтому текущий выходной файл Grades.txt будет пустым файлом.

  5. Я рекомендую вам создать класс под названием Person, где вы храните как строку имени и двойной (независимо это означает), а затем хранить каждый экземпляр Person в List<Person> (подкреплённый ArrayList<Person>) и сортировать этот список, используя обычай Comparator<Person> или путем внедрения Comparable<Person> в классе Person.

+0

У меня есть тот же выходной файл, потому что я хотел перезаписать предыдущий файл с отсортированной версией. –

+0

Итак, это не проблема, что первый токен - это строка, а не double, а '#hasNextDouble' возвращает false? Может быть замечание 2.5 :-). – Tom

+0

@ ph0bolus добавил * решение * к вашему нечетному требованию и примечанию, поясняющее, что нужно быть осторожным с ним. –

0

Вы можете использовать что-то вроде этого (я всегда использую кодировку для чтения, если вам не нужно это просто не использовать):

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...