当前位置: 首页 > 知识库问答 >
问题:

Comparator适用于我的ArrayList,但代码看起来是错误的?

邰宇
2023-03-14

我有一个名为Course的对象数组列表,我试着用两种方式对它进行排序,按courseID和Course start time。

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或开始时间排序的列表......但我不明白为什么。在课程类中,compareTo方法仅比较getCourseID。

需要比较courseBeginTime的StartTimeStorer如何工作?

我如何重写才能更有意义?

共有3个答案

齐运诚
2023-03-14

如果在集合中指定比较器。sort方法,它将考虑到这一点,即使类实现了Comparable。尝试在排序方法中不传递比较器的情况下进行排序,您将看到您所期望的结果,即compareTo方法生效。

通飞尘
2023-03-14

Collections.sort方法有两种变体。将单个参数作为可比对象的集合。另一个接受两个参数:第一个是集合,第二个是比较器。你用了第二个变体。因此,您的compareTo方法未被使用。

强烨
2023-03-14

如果一个类实现了可比,这被认为是这个类的自然排序。当您没有为Collections.sort提供显式的比较器时,将使用此排序。这就是为什么排序的单参数版本需要一个List

 类似资料: