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

Posted

技术标签:

【中文标题】相对于当前日期对 Java 集合进行排序【英文标题】:Sort Java collection relative to the current date 【发布时间】:2019-03-13 06:41:36 【问题描述】:

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

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 怎么做?

【问题讨论】:

将今天的日期添加到列表中,并像处理任何其他列表一样按降序排序。要么这个,要么我不明白你的问题。 你试过什么?你写了一个Comparator,它就像你说的那样。你在哪方面有问题? 请求家庭作业帮助的问题必须包括您迄今为止为解决问题所做的工作的总结,以及您在解决问题时遇到的困难的描述。请阅读What topics can I ask about here? 了解更多信息。 我的意思是之前的日期应该升序,之后的日期也应该升序,例如今天是十月。 8 和包含 oct 的列表。 10, 1, 2, 12, 15, 4 应该排序为:oct. 10、12、15(今天之后的日期按升序排列)和 10 月。 1、2、4(过去的日期也按升序排列),所以列表应该看起来像 10、12、15、1、2、4。我根本不知道该怎么做 【参考方案1】:

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

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

这读作首先比较每个日期是否在今天之后,然后使用LocalDate 的自然顺序进行排序。 (值得记住的是,对boolean 值进行排序意味着将falses 放在开头,将trues 放在结尾,即false < true

【讨论】:

Comparator.comparing(LocalDate.now()::isAfter) 有点棘手,但是一旦你理解了它就会非常令人愉悦。这是因为缺少comparingBoolean。我会记得,但如果我在自己的代码中使用它,可能会插入解释性注释。感谢您在答案中彻底解释。 mb 这是最好和简短的答案,但我忘了说它应该在 android 上工作,所以我只支持你的答案,对不起 不错的答案!我试着想这样的事情,但我没有找到,太好了!【参考方案2】:
    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);

【讨论】:

太棒了。 LocalDateComparator的很好的应用。【参考方案3】:

你可以这样看

如果您要比较的两个日期在今天的同一侧(都在之前或之后),请正常比较它们 如果你有一个之前和一个之后你需要颠倒顺序

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

【讨论】:

以上是关于相对于当前日期对 Java 集合进行排序的主要内容,如果未能解决你的问题,请参考以下文章

使用当前日期对日期(日期数组列表)进行排序

使用 Cloudfront 时,如何设置相对于当前日期的 Expires Header?

排序/过滤 NSFetchRequest 如何编写将使用当前日期的排序描述符?

使用日期对查询集进行排序

如何在Java中对MongoDB按日期进行查询统计

在 FAR 管理器中按日期对文件进行排序