根据课程的开始日期对对象列表进行排序
Sort List of object based on start date of the course
我需要对开始日期为字符串的课程列表进行排序。
排序应该根据开始日期,我在列表中的日期是这样的:
- 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
我怎样才能做到这一点,我试过了:
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
.
我需要对开始日期为字符串的课程列表进行排序。
排序应该根据开始日期,我在列表中的日期是这样的:
- 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
我怎样才能做到这一点,我试过了:
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
.