相对于当前日期对Java集合进行排序

时间:2018-10-08 14:51:07

标签: java android sorting date collections

我想对相对于当前日期的日期列表进行排序,例如,列表中有下一项:

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 :(得分:7)

我发现的最简洁,最优雅但最易读的方式如下:

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

首先将比较每个日期是否在今天之后,然后使用LocalDate的自然顺序来打破平局,将其解读为排序。 (值得记住的是,对boolean值进行排序意味着将false放在开头,将true放在结尾,即false < true。)

答案 1 :(得分:3)

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

答案 2 :(得分:2)

你可以这样看

  • 如果您要比较的两个日期在今天的同一侧(之前或之后),请正常进行比较
  • 如果您之前需要一个,之后需要一个来取消订单

这将保留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]