比较器适用于我的ArrayList,但代码看起来不对?

时间:2014-03-17 08:48:56

标签: java arraylist

我有一个名为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呢?

如何重写以使其更有意义?

4 个答案:

答案 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()));
    }       
}