2016-10-15 3 views
0

У меня есть довольно большая и в основном рабочая программа для моего класса. Он должен читать файлы студента и инструктора и печатать их по их курсам. И это работает правильно. Тем не менее, студенты должны быть напечатаны в соответствии с их классом, сначала старшие и первокурсники. Я проверил несколько сообщений, но я просто не могу понять, что я делаю неправильно.Java: сортировка студентов по их уровню

public class Student extends Person 
{ 
    String Course; 
    int Credits; 
    int Points; 
    ArrayList<String> sortedStudentsList = new ArrayList<String>(); 

    public Student(String id, String first, String last) 
    { 
     super(id,first,last); 
    } 

    public void student(String enrolledStudents) throws Exception 
    { 
     String csvFile = "StudentData.csv"; 
     BufferedReader br = new BufferedReader(new FileReader(csvFile)); 
     String line = null; 
     String firstLine = br.readLine(); 

     while ((line = br.readLine()) != null) 
     { 
     String[] studentData = line.split(","); 

     super.setID(studentData[0]); 
     super.setFirstName(studentData[1]); 
     super.setLastName(studentData[2]); 
     setCredits(studentData[5]); 
     setPoints(studentData[6]); 
     setCourse(studentData[4]); 

     ArrayList<String> studentArray = new ArrayList<String>(); 
     for(int k=0; k < 7; k--) 
     { 
      studentArray.add(studentData[k]); 
     } 

     Collections.sort(studentArray, sortStudentLevel); 

     if(studentData[4].equals(enrolledStudents)) 
     { 
      for (int i=0; i < studentArray.size(); i++) 
      { 
       System.out.println(super.getFirstName() + " " + super.getLastName() + ", ID Number " + super.getID() + ", is a " + studentData[3] + " enrolled in " + getCourse() + ". Earned " + getCredits() + " credit(s) and " + getPoints() + " point(s)"); 
      } 
     } 
     } 
    } 

    public static Comparator<String> sortStudentLevel = new Comparator<String>() 
    { 
     int compare(String s1, String s2) 
     { 
      String classLevel1 = s1.getClassLevel(); 
      String classLevel2 = s2.getClassLevel(); 

      return classLevel1.compareTo(classLevel2); 
     } 
    }; 
} 

Я оставил сеттеры и геттеры для этого класса, поскольку я думал, что они не так важны. Любая помощь приветствуется.

EDIT: форматирование кода

+5

'for (int k = 0; k <7; k -)' ... Почему 'k -'? Это бесконечный цикл. И 'k = -1' выдает ошибку –

+0

Вы должны упомянуть' ArrayIndexOutOfBoundsException' в вопросе. –

+0

С какой проблемой вы столкнулись? 'Collections.sort (studentArray, sortStudentLevel);' на первый взгляд выглядит нормально, поэтому кажется, что ваша проблема не связана с названием этого вопроса. Пожалуйста, отредактируйте ваше сообщение и правильно опишите, что [не работает] (http://importblogkit.com/2015/07/does-not-work/) – Pshemo

ответ

3

1) Вы хотите отсортировать список студентов. s1.getClassLevel() не будет разрешен для String s1. Вам нужен Comparator<Student>

2) Для сортировки списка Student, вам нужно ArrayList<Student> не является ArrayList<String>();

3) Для каждой строки файла CSV, вы сделали совершенно новый, пустой studentArray = new ArrayList<String>();

4) Вы зацикливаетесь назад нас k-- в петле

5) enrolledStudents не представляется неопределенным. if(studentData[4].equals(enrolledStudents)) на самом деле не имеет смысла в контексте вопроса. Вы просто хотите отсортировать распечатку списка, не так ли?

6) Класс Student действительно не должен нести ответственность за чтение CSV-файла. Это модель. Он содержит только данные, а не выполняет какую-либо логику, не связанную с Student.

7) Возможно, примените метод toString() на Студенте.

@Override 
public void toString() { 
    return super.getFirstName() + " " + super.getLastName() + ", ID Number " + super.getID() + ", is a " + getClassLevel() + " enrolled in " + getCourse() + ". Earned " + getCredits() + " credit(s) and " + getPoints() + " point(s)"; 
} 

8) Предупреждение о сравнении строк для уровня класса. Я считаю, "10".compareTo("9") < 0 оценивает как true и "sophomore".compareTo("senior") < 0 оценивает, например, false.


В целом, это должно быть в методе main, или где-нибудь, кроме Student класса.

String csvFile = "StudentData.csv"; 
BufferedReader br = new BufferedReader(new FileReader(csvFile)); 
String line = null; 
String firstLine = br.readLine(); // skip header 

ArrayList<Student> students = new ArrayList<Student>(); 

while ((line = br.readLine()) != null) 
{ 
    String[] studentData = line.split(","); 
    Student s = new Student(studentData[0], studentData[1], studentData[2]); 

    s.setClassLevel(studentData[3]); // You need this if you want to sort by it 
    s.setCourse(studentData[4]); 
    s.setCredits(studentData[5]); 
    s.setPoints(studentData[6]); 


    students.add(s); // Add one row of CSV to list 
} // Done reading the file. 

// Now, sort list 
Collections.sort(studentArray, new Comparator<Student>() { 
    int compare(Student s1, Student s2) 
    { 
     String classLevel1 = s1.getClassLevel(); 
     String classLevel2 = s2.getClassLevel(); 

     return classLevel1.compareTo(classLevel2); 
    } 
}); // Done sorting 

// Now print the students 
for (Student s : students) { 
    System.out.println(s); 
} 
Смежные вопросы