根据课程的开始日期对对象列表进行排序

Sort List of object based on start date of the course

我需要对开始日期为字符串的课程列表进行排序。

排序应该根据开始日期,我在列表中的日期是这样的:

注意此处的排序是自定义的,开始日期为 01 至 07 的每个项目都应低于 08 至 12 的日期

例如上面的列表将是:

我怎样才能做到这一点,我试过了:

int compare = this.getStartDate().compareTo(o.getStartDate());
if (compare > 0 && this.getStartDate().charAt(1) >= '1' && this.getStartDate().charAt(1) <= '7')
        return -1;
if (compare < 0 && o.getStartDate().charAt(1) < '1' && o.getStartDate().charAt(1) > '7')
        return 1;
return compare;

使用此方法通过将小时部分加 12 将低于“08:00”的时间转换为大于“12:00”的时间:

public static String getValue(String s) {
    String[] splitted = s.split(":");
    int hour = Integer.parseInt(splitted[0]);
    if (hour < 8) {
        hour += 12;
        splitted[0] = String.valueOf(hour);
    }
    return splitted[0] + ":" + splitted[1];
}

现在这样比较:

return getValue(this.getStartDate()).compareTo(getValue(o.getStartDate()));

java.time

不要在模型中用字符串表示一天中的时间。使用适当的时间 class。 Java 内置了一个(从 Java 8 开始;也向后移植到 Java 6 和 7):LocalTime.

public class Course implements Comparable<Course> {

    private static final LocalTime START_OF_COURSE_DAY = LocalTime.of(8, 0);
    /** Constant for PM of day (afternoon) */
    private static final int PM = 1;
    private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("hh:mm");

    LocalTime time;

    /**
     * @param timeString
     *          If the time string begins with 08 through 11, it is in AM, otherwise in PM
     */
    public Course(String timeString) {
        // Even though the time string is in either AM or PM,
        // just parse the hour as hour of day and adjust afterward.
        time = LocalTime.parse(timeString);
        if (time.isBefore(START_OF_COURSE_DAY)) {
            // time is in PM
            time = time.with(ChronoField.AMPM_OF_DAY, PM);
        }
        // toString() should give the same string back
        if (! toString().equals(timeString)) {
            System.out.println("Unexpected time format: " + timeString);
        }
    }

    @Override
    public int compareTo(Course o) {
        return time.compareTo(o.time);
    }

    @Override
    public String toString() {
        return time.format(TIME_FORMATTER);
    }

}

由于 LocalTime 是可比较的(具有与我们想要的顺序一致的自然顺序),compareTo 的实现是单行的。

让我们试试看:

        List<Course> listOfCourses = Arrays.asList(
                new Course("03:20"),
                new Course("04:10"),
                new Course("09:40"),
                new Course("08:00"),
                new Course("08:50"),
                new Course("01:50"),
                new Course("02:30"),
                new Course("12:30"));
        listOfCourses.sort(Comparator.naturalOrder());

        listOfCourses.forEach(System.out::println);

输出为:

08:00
08:50
09:40
12:30
01:50
02:30
03:20
04:10

Link: Oracle tutorial: Date Time 解释如何使用 java.time.