有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java8中,是否将一个日期与三个或三个以上的日期进行比较?

使用java。时间API可以使用以下语法比较两个日期:

date1.before(date2);

date2.after(date1);

但是,当比较3个或更多日期时,这会变得非常冗长。 是否有方法将一个日期与多个其他日期进行比较,以确定提供的日期是否在所有其他日期之前/之后


共 (3) 个答案

  1. # 1 楼答案

    因为这个问题是关于Java 8,这里有一个“Java 8ish”解决方案:

    boolean beforeEarliest = Stream.of(date1, date2, date3).allMatch(date::isBefore);
    boolean afterLatest    = !beforeEarliest &&
                             Stream.of(date1, date2, date3).allMatch(date::isAfter);
    

    Andy Turner’s solution相比,这不仅是一个“Java8风格”的解决方案,而且执行的比较更少

    对于两个测试中的任何一个,要找到最小值,请分别。如果最多有n个元素,则需要进行n-1比较,然后将找到的元素与date进行比较,因此,总的比较次数为n。相比之下,这个基于流的解决方案将最多比较n元素和参考date,最多比较n。由于这种基于流的解决方案是短路的,即在第一个不匹配的元素处停止,因此比较的总数较低,除非它们都匹配,在这种情况下,另一个测试的第一次比较将失败

    如果第一个测试成功,您可以将Collections.min/Collections.max解决方案更改为跳过第二个测试,但最坏的情况仍然是2*n比较,而基于流的解决方案的最坏情况是n+1比较

  2. # 2 楼答案

    如果你把所有的东西都放在一个集合里,也许会有帮助: 收藏。最多(日期); 收藏。分钟(日期)

  3. # 3 楼答案

    你要做的就是把这个日期和你的“3个或更多”日期中的一个进行比较:你只需要找出哪个是,然后比较两个日期

    由于Date实现了Comparable<Date>,因此可以使用Collections.minCollections.max查找最早和最新的两个:

    Date earliest = Collections.min(Arrays.asList(date1, date2, date3));
    Date latest   = Collections.max(Arrays.asList(date1, date2, date3));
    

    然后:

    boolean beforeEarliest = date.before(earliest);
    boolean afterLatest    = date.after(latest);
    

    等等