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

时间:2018-11-25 10:29:13

标签: java collections compareto

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

排序应基于开始日期,列表中的日期如下:

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

注意,这里的排序是自定义的,开始日期从01到07的每个项目都应低于08到12的日期

例如上面的列表将是:

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

我如何做到这一点,我做了以下尝试:

@Override
protected boolean onKeyEvent(KeyEvent event) {
    int keyCode = event.getKeyCode();

    KeyEvent.KEYCODE_META_RIGHT
    switch (keyCode) {
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            Log.d("##CURRENTKEY", "Volume -");

        case KeyEvent.KEYCODE_VOLUME_UP:
            Log.d("##CURRENTKEY", "Volume +");
            return false;
    }
    return super.onKeyEvent(event);
}

2 个答案:

答案 0 :(得分:1)

使用此方法,将小时部分加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()));

答案 1 :(得分:0)

java.time

不要用模型中的字符串来表示一天中的时间。使用适当的时间课程。 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

链接: Oracle tutorial: Date Time解释了如何使用java.time