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: Дата и время , объясняющее, как использовать java.time
.