Java - Как я могу сделать метод чтения без пропуска строки из-за другого метода readline - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь настроить систему рекордов, чтобы отсортировать оценки из файла и отделить имена от чисел.Но когда я пытаюсь использовать readline дважды, он пропускает 1 строку из-за другого метода readline.Может кто-нибудь помочь мне, пожалуйста, это для школы!

Пример файла:

Кевин: 50 пыли: 31 никто: 71 imax: 23

Вот код:

public class Main {
public static void main(String[] args) {
    ArrayList<Integer> result = new ArrayList<>();
    String name="";
    try (BufferedReader br= new BufferedReader(new FileReader("res/highscore.txt"))){
        while (br.ready()){
            result.add(Integer.parseInt(br.readLine().split(":")[1]));
            name = br.readLine().split(";")[0];
            System.out.println(name);
        }
        Collections.sort(result);
        Collections.reverse(result);
        for (Integer integer : result) {
            System.out.println(integer);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

Небольшое объяснение ответа @ thewho69.

Вы попали в ловушку побочных эффектов. Метод может не только делать то, что подсказывает его имя. В этом примере метод readLine() не только читает предстоящую строку, но также устанавливает позицию курсора в начале следующей строки.

Это делает метод readLine не идемпотентным, что означает, что вызов метода дважды с одинаковыми параметрами (в данном случае ни одного) не обязательно вернет один и тот же результат.

Чтобы не попасть в эту ловушку, вы должны найти способ использовать текущую одну строку несколько раз, при этом вызывая метод br.readLine() только один раз - таким образом, установить позицию курсора только один раз в итерации, что желательно в этом случае. Хорошее решение этой проблемы - то, что @wwho69 предложил ~ 20 минут назад.

1 голос
/ 11 марта 2019

Просто сохраните каждую строку в переменной:

public class Main {
    public static void main(String[] args) {
    ArrayList<Integer> result = new ArrayList<>();
    String name="";
    try (BufferedReader br= new BufferedReader(new FileReader("res/highscore.txt"))){
        String line;
        while ((line = br.readLine()) != null){
            result.add(Integer.parseInt(line.split(":")[1]));
            name = line.split(";")[0];
            System.out.println(name);
        }
        Collections.sort(result);
        Collections.reverse(result);
        for (Integer integer : result) {
            System.out.println(integer);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
...