我需要对课程列表进行排序,其开始日期为字符串。
排序应基于开始日期,列表中的日期如下:
注意,这里的排序是自定义的,开始日期从01到07的每个项目都应低于08到12的日期
例如上面的列表将是:
我如何做到这一点,我做了以下尝试:
@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);
}
答案 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具有一个内置的(从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
。