Сортировать коллекцию Java относительно текущей даты - PullRequest
0 голосов
/ 08 октября 2018

Я хочу отсортировать свой список дат относительно текущей даты, например, у нас есть следующие элементы в списке:

10.01.2018, 
10.20.2018, 
10.14.2018, 
10.02.2018 

и текущая дата 10.08.2018.

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

10.14.2018, 
10.20.2018    and then 
10.01.2018, 
10.02.2018. 

Сначала должны быть даты, которые не произошли, а затем прошедшие даты.Как это сделать с Comparator?

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Вы можете видеть это так

  • , если две сравниваемые даты находятся на одной стороне (до или после) сегодняшнего дня, обычно сравнивайте их
  • , еслиу вас есть один до и один после того, как вам нужно изменить порядок

Это сохранит ascending order, но установит будущие даты раньше прошлых

public static void main(String[] args) {
    List<LocalDate> list = Arrays.asList(
                                      LocalDate.of(2018, 10, 1), LocalDate.of(2018, 10, 20),
                                      LocalDate.of(2018, 10, 14),LocalDate.of(2018, 10, 2));
    System.out.println(list);
    LocalDate now = LocalDate.now();

    list.sort((o1, o2) -> {
        if (o1.isBefore(now) && o2.isBefore(now) || o1.isAfter(now) && o2.isAfter(now)) {
            return o1.compareTo(o2);
        }
        return o2.compareTo(o1);
    });

    System.out.println(list);
}


[2018-10-01, 2018-10-20, 2018-10-14, 2018-10-02]
[2018-10-14, 2018-10-20, 2018-10-01, 2018-10-02]
0 голосов
/ 08 октября 2018

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

list.sort(
    Comparator
    .comparing( LocalDate.now()::isAfter )
    .thenComparing( Comparator.naturalOrder() )
);

Это читается как сортировка, сначала сравнивая, является ли каждая дата после сегодняшней даты или нет, затем разбиваетсясвязи, используя LocalDate естественный порядок .(Стоит помнить, что сортировка значений boolean означает установку false с в начале и true с в конце, то есть false < true).

0 голосов
/ 08 октября 2018
    LocalDate now = LocalDate.now();

    List<LocalDate> dates = Arrays.asList(
            LocalDate.parse("2018-10-02"),
            LocalDate.parse("2018-10-20"),
            LocalDate.parse("2018-10-14"),
            LocalDate.parse("2018-10-01"));

    // sort relative to the current date
    dates.sort(Comparator.<LocalDate>comparingInt(localDate ->
            localDate.isAfter(now) ? -1 : localDate.isBefore(now) ? 1 : 0)
            // then sort normally
            .thenComparing(Comparator.naturalOrder()));

    System.out.println(dates);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...