你可以用两种不同的方式对这个ArrayList进行排序吗?编写自己的Comparator?

时间:2014-03-17 09:26:57

标签: java arraylist

我有一个名为Course的对象ArrayList,我试图通过courseID和courseStartTime以两种方式对它进行排序。

编辑:澄清我的意思是我想在某个时间点按课程ID对其进行排序,然后在另一时间按课程时间排序。

class Course implements Comparable<Course> {
    private int courseID;
    private String courseBeginTime;

    @Override
    public int compareTo(Course course) {
        //what to return?
    }

如果我写了两个我自己的比较器,一个用于比较courseID而另一个用于courseStarTime,那么类中的compareTo()方法不会被使用而我不会知道该返回什么。

如果我想使用compareTo()方法,我不知道如何编写它,以便我可以比较courseIDcourseStartTime

4 个答案:

答案 0 :(得分:8)

您可以实现两种不同的比较器。

public class CourseComparatorById implements Comparator<Course> {

    @Override
    public int compare(Course o1, Course o2) {
        // for example - sort ascending by ID
        return o1.getId() - o2.getId();
    }
}

public class CourseComparatorByStartTime implements Comparator<Course> {

    @Override
    public int compare(Course o1, Course o2) {
        // for example - sort ascending by start time
        return o1.getStartTime() - o2.getStartTime();
    }
}

然后使用它们对数组进行排序。

List<Course> courses = ...

Collections.sort(courses, new CourseComparatorById());
// now it's sorted by ID

Collections.sort(courses, new CourseComparatorByStartTime());
// now it's sorted by start time

答案 1 :(得分:3)

您也可以尝试Java 8 Lambda方式:

// this sorts by courseID
courseList.sort((c1, c2) -> Integer.valueOf(c1.courseID).compareTo(c2.courseID));

// this sorts by String courseBeginTime
courseList.sort((c1, c2) -> c1.courseBeginTime.compareTo(c2.courseBeginTime));

请注意,Java 8您不必使用Collections.sort,因为新的List界面还提供了sort方法

答案 2 :(得分:1)

我感觉这是用于在线注册网络应用程序... 你可能会从RDB中获取数据源......将所有课程放在一个列表(一个实体)并保存它是不明智的。我会为每个课程创建一个对象(包含courseID和courseBeginTime)并将它们全部保存。然后在查询时,添加提示,根据您在其中的任何根参数(如courseID或courseBeginTime)对实体进行排序,以包含按您想要的方式排序的对象的List结束:) :)

答案 3 :(得分:0)

可能你应该做这样的事情

public class Course implements Comparator<Course> {

    private int compareTime(int lhsTime, int rhsTime) {
        if (lhsTime > rhsTime) {
            return 1;
        } else if (lhsTime == rhsTime) {
            return 0;
        } else {
            return -1;
        }
    }   

    @Override
    public int compare(Course lhs, Course rhs) {
        if (lhs.id > rhs.id) {
            return 1;
              //Get the time object from course obj and pass to compaerTime
        } else if (lhs.courseStarTime == rhs.courseStarTime) {
            return compareTime(lhs, rhs);
        } else {
            return -1;
        }
    }

}