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

kof*_*lox 5 java sorting collections android date

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

10.01.2018, 
10.20.2018, 
10.14.2018, 
10.02.2018 
Run Code Online (Sandbox Code Playgroud)

而目前的日期是10.08.2018.

结果应该是下一个顺序的升序排序:

10.14.2018, 
10.20.2018    and then 
10.01.2018, 
10.02.2018. 
Run Code Online (Sandbox Code Playgroud)

首先应该是没有发生的日期,然后是过去的日期.怎么用比较器做?

Fed*_*ner 7

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

list.sort(
    Comparator
    .comparing( LocalDate.now()::isAfter )
    .thenComparing( Comparator.naturalOrder() )
);
Run Code Online (Sandbox Code Playgroud)

通过首先比较每个日期是否在今天之后,然后使用LocalDate自然顺序打破关系来读取排序.(值得记住的是,排序boolean值意味着将falses放在开头,将trues放在最后,即false < true).

  • 再次,这必须是公认的答案 (2认同)
  • 那个`Comparator.comparing(LocalDate.now():: isAfter)`有点棘手,但是一旦理解了它就非常讨人喜欢.这是因为缺少`comparisonBoolean`.我会记得,但如果我在自己的代码中使用它,可能会插入解释注释.感谢您在答案中彻底解释. (2认同)

azr*_*zro 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]
Run Code Online (Sandbox Code Playgroud)