Сортировка списка объектов по дате начала курса - PullRequest
0 голосов
/ 25 ноября 2018

Мне нужно отсортировать список курсов с датой начала. Строки.

Сортировка должна основываться на дате начала, моя дата в списке выглядит следующим образом:

  • 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;

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

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.

0 голосов
/ 25 ноября 2018

Используйте этот метод, который преобразует времена ниже «08:00» во времена, превышающие «12:00», добавляя 12 к часовой части:

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()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...