我有一个Date对象列表和一个目标Date.我想在列表中找到最接近目标日期的日期,但只查找目标日期之前的日期.
示例:2008-10-1 2008-10-2 2008-10-4
目标日期为2008-10-3,我希望得到2008-10-2
最好的方法是什么?
private Date getDateNearest(Listdates, Date targetDate){ return new TreeSet (dates).lower(targetDate); }
不需要预先排序的列表,TreeSort可以解决此问题。如果找不到,它将返回null,因此如果有问题,则必须对其进行修改。也不确定效率:P
Sietse de Kaper解决方案假设一个反向排序列表,绝对不是最自然的东西
java中的自然排序顺序遵循升序自然排序.(参见Collection.sort http://java.sun.com/j2se/1.5.0/docs/api/java/util/Collections.html#sort(java.util.List)文档)
从你的例子来看,
target date = 2008-10-03 list = 2008-10-01 2008-10-02 2008-10-04
如果另一个开发人员以一种天真的方式使用你的方法,他将得到2008-10-01,这不是预期的
不要对列表的顺序做出假设.
如果您出于性能原因,请尝试遵循最自然的约定(按升序排序)
如果你真的必须遵循另一个约定,你真的应该记录它的地狱.
private Date getDateNearest(Listdates, Date targetDate){ Date returnDate = targetDate for (Date date : dates) { // if the current iteration'sdate is "before" the target date if (date.compareTo(targetDate) <= 0) { // if the current iteration's date is "after" the current return date if (date.compareTo(returnDate) > 0){ returnDate=date; } } } return returnDate; }
编辑 - 我也喜欢Treeset的答案,但我认为它可能稍慢,因为它相当于排序数据然后查找=> nlog(n)进行排序,然后文档暗示它是log(n)进行访问所以这将是nlog(n)+ log(n)vs n