Возникли проблемы с результатами в конкатенации текстовых файлов - PullRequest
0 голосов
/ 13 января 2020

Я занимаюсь чтением системы размещения Студенческого проекта из текстовых файлов. Это читает файлы и дает им лучший проект. Ранее я пытался сделать все варианты проекта на отдельной строке с информацией о студенте (имя, адрес электронной почты и ID), и это сработало. Тем не менее, я попытался поместить их все в одну строку, и пропускается вперед, когда я должен увидеть кого-то, кто не выбрал четыре проекта. Вот что такое текстовый файл:

7                                   
Allan,A a.allan@outlook.ac.uk 53027 1 3 4 2
Brown,B b.brown@outlook.ac.uk 45696 1 2 3 4
Craig,C c.craig@outlook.ac.uk 45667 2 1 4 3
Douglas,D d.douglas@outlook.ac.uk 52981 3 4 1 2
Edward,E e.edward@outlook.ac.uk 45048 3
Findlay,F f.findlay@outlook.ac.uk 46904 2 1 3
Graham,G g.graham@outlook.ac.uk 58733 2 4

Верхнее число «7» - это количество студентов, длинное число - это идентификатор, а другие числа - это номера проекта. Когда отладчик достигает Эдварда, первого и единственного выбора E проекта 3, программа думает, что его второй выбор - Findlay, F, и вызывает ошибку NumberFormatException. Вот код на данный момент:

public Student(int id,Scanner scanner) {
        listOfPreferences=new ArrayList<Project>();
        projectID= new ArrayList<Integer>();
        setID(id);

        String name=scanner.next();
        this.setName(name);

        String email=scanner.next();
        this.setEmail(email);

        String ID = scanner.next();
        this.setID(id);

        //scanner.nextLine();
        String preferences=scanner.next();
        String totalPreferences[] = preferences.split(" ");

        String preferences2=scanner.next();
        String totalPreferences2[] = preferences2.split(" ");

        String preferences3=scanner.next();
        String totalPreferences3[] = preferences3.split(" ");

        String preferences4=scanner.next();
        String totalPreferences4[] = preferences4.split(" ");

        for(String project: totalPreferences)
        {
            projectID.add(Integer.valueOf(project));
        }


        for(String project: totalPreferences2)
        {
            projectID.add(Integer.valueOf(project));
        }

        for(String project: totalPreferences3)
        {
            projectID.add(Integer.valueOf(project));
        }

        for(String project: totalPreferences4)
        {
            projectID.add(Integer.valueOf(project));
        }
}

Может кто-нибудь помочь, поскольку я действительно застрял?

1 Ответ

0 голосов
/ 13 января 2020

Измените свой подход, чтобы создать код, который обрабатывает каждую строку изолированно. Предполагая, что одну строку данных можно поместить в объект типа Student, вы должны сделать что-то вроде:

private List<Student> students = new ArrayList<>(); 
for (int i = 0; i < maxLineCount; i++) {
    String line = scanner.nextLine();
    students.add(processLine(line));
}
public Student processLine(String line) {
    // code here to create a data object from each line
    // using either String#split(..)
    // or using a separate Scanner created for each line and then disposed
    return new Student(....); // create your data object from the processed line
}

Обратите внимание, что число конечных чисел может варьироваться, и поэтому вам нужно будет использовать некоторое время l oop, используя от while (someScanner.hasNextInt()) до l oop, при использовании сканера

Например:

public Student processLine(String line) {
    Scanner lineScanner = new Scanner(line);

    String name = lineScanner.next();
    String email = lineScanner.next();
    String id = lineScanner.next();

    List<Integer> values = new ArrayList<>();
    while(lineScanner.hasNextInt()) {
        values.add(lineScanner.nextInt());
    }       
    lineScanner.dispose(); // done with the line scanner

    // using data collected above create my data or Student?
    return new Student(...);        
}

Отдельная проблема: не передавайте сканер в конструктор Student, так как не следует смешивать логические классы, такие как Student, и код вашего пользовательского интерфейса (пользовательского интерфейса). Вместо этого предоставьте Студенту конструктор, который принимает данные, которые имеют смысл - имя, адрес электронной почты, идентификатор, .... и собирайте данные в разделе пользовательского интерфейса вашей программы, создавая объекты Student по мере сбора данных.

...