У меня есть объект ArrayList, называемый курсом, и я пытаюсь сортировать его двумя способами: по курсуID и времени начала курса.
class Course implements Comparable<Course> {
private int courseID;
private String courseBeginTime;
// implement the compareTo method defined in Comparable
@Override
public int compareTo(Course course) {
if (getCourseID() > course.getCourseID()){
return 1;
} else if(getCourseID() < course.getCourseID()){
return -1;
} else {
return 0;
}
}
Тогда у меня есть эти компараторы:
//implement the comparators
class IDSorter implements Comparator<Course> {
public int compare(Course course1, Course course2) {
return Integer.compare(course1.getCourseID(), course2.getCourseID());
}
}
class startTimeSorter implements Comparator<Course> {
public int compare(Course course1, Course course2) {
return Integer.compare(Integer.parseInt(course1.getCourseBeginTime()),
Integer.parseInt(course2.getCourseBeginTime()));
}
}
Я сортирую их по своему основному методу следующим образом:
Collections.sort(courseList, new IDSorter());
Collections.sort(student.getStudentSchedule(), new StartTimeSorter());
Код работает, я могу получить список, отсортированный по ID или startTime.... но я не понимаю, почему. В классе Course метод compareTo сравнивает только getCourseID.
Как работает StartTimeSorter, которому нужно сравнить курсBeginTime?
Как я могу переписать, чтобы иметь больше смысла?
Если класс реализует Comparable
, это считается естественным упорядочением этого класса. Это упорядочение используется, когда вы не даете явный Comparator
to Collections.sort
. Поэтому единственная аргументация сортировки принимает List<T>
где T extends Comparable<? super T>
T extends Comparable<? super T>
. Две версии аргументов берут List<T>
без ограничений на T и Comparator<? super T>
Comparator<? super T>
. Поэтому Course.compareTo
не используется в вашем примере.
Существует два варианта метода Collections.sort. Один принимает один аргумент как набор объектов Comparable. Другой принимает два аргумента: во-первых, второй сбор является компаратором. Вы использовали второй вариант. Следовательно, метод compareTo не используется.
Если вы укажете Comparator
в методе Collections.sort
, это учтет это, несмотря на то, что класс реализует Comparable
. Попробуйте выполнить сортировку без передачи Comparator
в методе сортировки, вы увидите, чего вы ожидаете, т.е. Метод compareTo.
Я думаю, что ваш метод compareTo должен быть таким:
@Override
public int compareTo(Course course) {
if (getCourseID() > course.getCourseID()){
return 1;
} else if(getCourseID() < course.getCourseID()){
return -1;
} else {
return Integer.compare(Integer.parseInt(getCourseBeginTime()),
Integer.parseInt(course.getCourseBeginTime()));
}
}