Java - чтение CSV-файла в конструктор

Java (проблема с конструктором)

Пытаюсь понять, как читать CSV-файл в конструкторе. Тема - Гарри Поттер, и я читаю в 4 файлах (Гриффиндор, Хаффлпафф, Рейвенкло, Слизерин). Читаю это в моем House.java, но School.java и Student.java также имеют конструкторы / геттеры и сеттеры. Поставляется ниже. Например, внутри Школа существует жилой дом, а внутри него существует Ученик. В 4 предоставленных файлах CSV каждый файл представляет собой имя "Жилой дом", в котором вы читаете в файле как "Студенты" (имя, фамилия, год).

Эти 3 файла java находятся в application.model для поддержки приложения в JavaFX с использованием формата MVC. Он специально разработан таким образом для выставления оценок.

House.java

public class House {

 private String name;
 private String color;
 private String professor;
 public ArrayList<Student> Students;

 public House(String name, String color, String professor, ArrayList stdList) {
     this.name = name;
     this.color = color;
     this.professor = professor;
     this.Students = stdList;
 }

public ArrayList<Student> sortStudents(ArrayList<Student> allStudents) {
    if (allStudents != null) {
        Collections.sort(allStudents, new SortTool());
    }
    return allStudents;
}

 public void dataLoader() {
    String fileName = "Gryffindor.csv";
    String content = null;
        /*
        * Shows working path System.out.println(newFile(".").getAbsoluteFile());
        */
    try {
        Scanner inputStream = new Scanner(new File(fileName));
        // Delimits by commas and (enter or \n)
        inputStream.useDelimiter("[,\n]");
        // Iteration rather than iterable
        while (inputStream.hasNext()) {
            content = inputStream.nextLine();
        }
        inputStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

School.java

public class School {
 private String name;
 private int enrollment;
 private House houses[];

 /*
 * School Constructor
 *
 * @param pass in name to set name
 */
 public School(String name) {
    this.name = name;
    houses = new House[4];
    enrollment = 0;
   }
}

Student.java

public class Student {
 private String firstName;
 private String lastName;
 private int year;

 public Student(String firstName, String lastName, int year) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.year = year;
   }
}

SortTool.java открытый класс SortTool реализует Comparator {

@Override
public int compare(Student a, Student b) {
int c = a.getYear() - b.getYear();

if (c == 0)
    c = a.getLastName().compareTo(b.getLastName());
if (c == 0)
    c = a.getFirstName().compareTo(b.getFirstName());

return c;
}

}

Пытаюсь быть дискретным в отношении всей программы с тех пор, как я ее написал, и не хочу, чтобы это воспринималось как плагизм. House.java - как мне прочитать этот CSV-файл в конструкторе. Разделены запятыми, их нужно читать, а не вводить вручную.

Пример Gryffindor.csv

Колин Криви, 1, Гермиона Грейнджер, 2, Гарри Поттер, 2,

Ваш вопрос не очень ясен. Что вы имеете в виду, читая «в конструктор»? Вы хотите сказать, что, по вашему мнению, конструктор должен содержать код, читающий файл CSV? Некоторые люди сочтут этот дизайн плохим.

Dawood ibn Kareem 22.07.2018 00:35

Я здесь с @DawoodibnKareem; чтение и прочее в конструкторе может быть не лучшей идеей. Конструктор в основном используется для создания экземпляра объекта.

achAmháin 22.07.2018 00:38

Извините, например, в школе существует Дом, а в нем - Ученик. В 4 предоставленных файлах CSV каждый файл представляет собой название «Дома», которое вы читаете в файле как «Студенты» (имя, фамилия, год).

Conde 22.07.2018 00:39

@notyou Эти 3 файла java находятся в application.model для поддержки приложения в JavaFX с использованием формата MVC. Он специально разработан таким образом для выставления оценок.

Conde 22.07.2018 00:43

В этом вопросе есть элементы, не связанные с использованием вами конструктора. Попробуйте разбить проблему на более мелкие компоненты и посмотрите, сможете ли вы более четко объяснить, с чем у вас проблемы. Например, что вы делаете с content в dataLoader()?

Pedantic 22.07.2018 01:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
707
1

Ответы 1

Вы можете прочитать файл конструктора класса House. Просто добавьте частный метод, который будет заполнять список массивов студентов. Вы должны открыть файл, в котором указан путь к расположению файлов каждого дома, и добавить его с помощью "/"+this.name+".csv", а затем для каждой строки прочитанного файла вы проанализируете его и добавите новый Студент в арайлисте. Пример метода:

private void populateHouseFromFile(){
    String line;
    br = new BufferedReader(new FileReader(PATH_TO_HOUSES+"/"+this.name+".csv"));
    while ((line = br.readLine()) != null) {
        String[] split = line.split(",",3); //Retrieve each part of the student information , assuming each field is separated with a "," and each line is new entry.
        this.Students.add(new Student(split[0],split[1],Integer.decoded(split[2])));
    }
}

Вы должны проверить, что int конструктор студента, что переданный аргумент не является глупым (отрицательный год и т. д., Если плохо построен .csv).

В строке: this.Students.add (новый студент (строка [0], строка [1], Integer.decoded (строка [2]))); Он заявляет, что для строки [0], например, это «- Тип выражения должен быть типом массива, но он разрешен в String»

Conde 22.07.2018 04:25

Извините, я забыл присвоить значение разделения строке и использовать его, я исправляю свой ответ, подождите секунду. Теперь он должен работать.

Sami Tahri 22.07.2018 12:05

Другие вопросы по теме