Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 你能用两种不同的方式对这个数组列表进行排序吗?编写你自己的比较器?_Java_Arraylist - Fatal编程技术网

Java 你能用两种不同的方式对这个数组列表进行排序吗?编写你自己的比较器?

Java 你能用两种不同的方式对这个数组列表进行排序吗?编写你自己的比较器?,java,arraylist,Java,Arraylist,我有一个名为Course的对象数组列表,我试图按courseID和courseStartTime两种方式对它进行排序 class Course implements Comparable<Course> { private int courseID; private String courseBeginTime; @Override public int compareTo(Course course) { //what to ret

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

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

    @Override
    public int compareTo(Course course) {
        //what to return?
    }
编辑:为了澄清我的意思,我想在某个时间点按courseID排序,然后在另一个时间点按courseStartTime排序

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。

可能你应该这样做

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

    @Override
    public int compareTo(Course course) {
        //what to return?
    }
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;
        }
    }

}

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

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

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

您也可以尝试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,因为新的列表接口还提供了一个排序方法

,我不知道返回什么-好的,比较实现感兴趣的任何属性的结果。不太清楚你的问题是什么…我不确定我在听,你想要两种不同的订单吗?或者您有一个主顺序和辅助顺序,即仅当主顺序相同时才使用辅助顺序?写两个。根本不必费心让你的班级具有可比性;只要在你想排序的时候使用合适的比较器就行了。但是,除了原始列表外,还需要两个列表来存储结果。Collections.sort修改列表。是否主要按一个属性(如courseID)排序,并按另一个属性排序ID相等的课程?如果需要按courseID vs courseStartTime排序,我将如何调用它?您可以这样调用Collections.sortunSortedList,新课程Compareso在这种情况下,课堂课程不再需要实现可比性,对吗?不需要。如果你想让一个实体以两种不同的方式进行比较,那么这就可以了。