我有一个名为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()
方法,我不知道如何编写它,以便我可以比较courseID
和courseStartTime
。
答案 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;
}
}
}