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,
Я здесь с @DawoodibnKareem; чтение и прочее в конструкторе может быть не лучшей идеей. Конструктор в основном используется для создания экземпляра объекта.
Извините, например, в школе существует Дом, а в нем - Ученик. В 4 предоставленных файлах CSV каждый файл представляет собой название «Дома», которое вы читаете в файле как «Студенты» (имя, фамилия, год).
@notyou Эти 3 файла java находятся в application.model для поддержки приложения в JavaFX с использованием формата MVC. Он специально разработан таким образом для выставления оценок.
В этом вопросе есть элементы, не связанные с использованием вами конструктора. Попробуйте разбить проблему на более мелкие компоненты и посмотрите, сможете ли вы более четко объяснить, с чем у вас проблемы. Например, что вы делаете с content в dataLoader()?




Вы можете прочитать файл конструктора класса 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»
Извините, я забыл присвоить значение разделения строке и использовать его, я исправляю свой ответ, подождите секунду. Теперь он должен работать.
Ваш вопрос не очень ясен. Что вы имеете в виду, читая «в конструктор»? Вы хотите сказать, что, по вашему мнению, конструктор должен содержать код, читающий файл CSV? Некоторые люди сочтут этот дизайн плохим.