我有一个名为Course的对象的ArrayList,我试图通过courseID和课程开始时间以两种方式对它进行排序。
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如何比较courseBeginTime呢?
如何重写以使其更有意义?
答案 0 :(得分:2)
如果某个类实现Comparable
,则会将其视为此类的自然顺序。如果您未向Comparator
明确Collections.sort
,则会使用此排序。这就是为什么sort的单个参数版本需要List<T>
T extends Comparable<? super T>
。两个参数版本采用List<T>
,对T和Comparator<? super T>
没有限制。因此,您的示例中未使用Course.compareTo
。
答案 1 :(得分:1)
Collections.sort方法有两种变体。一个参数作为Comparable对象的集合。另一个有两个参数:第一个是集合,第二个是比较器。你使用了第二种变体。因此,不使用compareTo方法。
答案 2 :(得分:1)
如果您在Comparator
方法中指定了Collections.sort
,则无论该类是否实现Comparable
,都会将其考虑在内。尝试排序而不在排序方法中传递Comparator
,您将看到您期望的内容,即compareTo方法启动。
答案 3 :(得分:0)
我认为你的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()));
}
}