我想对相对于当前日期的日期列表进行排序,例如,列表中有下一项:
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?
答案 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]