如何在Java中获取一组日期变量中最近的日期?

7

我有8个不同变量名的日期变量(java.util.Date)。选择这些日期中最近(最大)的日期,最高效/最佳的方式是什么?


只需一次。所有日期变量值可能不同。我只是试图高效地找到最近的日期以在JSP页面上显示。 - user6123723
最近的日期是否总是最大的,还是需要考虑未来的日期? - eabraham
最近的日期是最大的。所有的日期都是过去的日期。 - user6123723
5个回答

23

理想情况下,将它们存储在一个集合中——这在你的程序设计方面可能是有意义的。如果你有一个List对象,你可以这样做:

Collections.max(dates);

6
将它们放入一个列表中,使用 Collections.max 方法。

4

Date是可比较的,因此将它们全部添加到一个列表中,然后使用Collections.max()找到最大(最新)日期:

List<Date> dates = new ArrayList<Date>();
dates.add(foo);
dates.add(bar);
... etc
Date latest = Collections.max(list);

实际上,如果您想变得高级一些,您可以这样做:
public static <T extends Comparable<T>> T max(T... items) {
    return Collections.max(Arrays.asList(items));
}

这样调用:

Date latest = MyClass.max(foo, bar, fred);

但它也适用于任何Comparable

Integer biggest = MyClass.max(3, 7, 4, 1);

2
这是 O(N log N),而 Collections.max 是 O(N)。 - Richante

4

由于您将所有日期存储在不同的变量中,因此需要执行以下可变参数函数,并将所有变量传递给它:

protected Date getMostRecentDate(Date ... dates) {
    Arrays.sort(dates);
    return myDateArray[dates.length - 1];
}

那么,你可以这样调用它:
Date mostRecent = getMostRecentDate(date1, date2, date3 /* etc.*/);

这不是高效的,因为他只想获取一次最大值。排序需要O(N*logN)的时间,而单个最大值操作只需要O(N)的时间。 - Tudor
@Tudor 当然可以,但公平地说,如果N很小(我假设他的N很小,否则维护许多不同的字段将是很大的工作量),那么不会有太大的区别。 - stevevls

1
将它们全部添加到一个集合中,然后进行排序,或者将它们添加到一个一开始就有序的集合中,比如PriorityQueue:
PriorityQueue<Date> dateQ = new PriorityQueue<Date>();
dateQ.add(someDate);
dateQ.add(anotherDate);
dateQ.add(thirdDate); // etc...
System.out.println("Max date is: " + dateQ.peek());

这个实现的效率与使用常规集合的实现相比如何? - user6123723
1
好问题。这应该是O(N log N),就像将其添加到列表中,然后排序一样。然而,Collections.max(正如其他几个答案中提到的)是O(N),所以肯定比我的答案更高效。 - mongiesama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接