【问题标题】:Sort Java collection relative to the current date相对于当前日期对 Java 集合进行排序
【发布时间】: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。我根本不知道该怎么做

标签: java android sorting date collections


【解决方案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);

【讨论】:

  • 太棒了。 LocalDate和Comparator的很好的应用。
【解决方案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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2011-10-20
    • 2013-03-18
    • 1970-01-01
    • 2020-03-16
    • 2011-07-09
    相关资源
    最近更新 更多