我有一个日期列表和一个目标日期对象。我需要找到最近的上一个日期(在目标日期之前)。我已尝试过以下内容,但我认为它不会仅适用于之前的日期。
private Date getDateNearest(List<Date> dates, Date targetDate) {
Date returnDate = targetDate;
for (Date date : dates) {
if (date.compareTo(targetDate) <= 0 && date.compareTo(returnDate) > 0) {
returnDate=date;
}
}
return returnDate;
}
答案 0 :(得分:1)
由于Date
实现Comparable
,这应该像
Date previousDate = new TreeSet<Date>(dates).lower(targetDate);
显然,为了方便单线程,这会带来一些额外的开销。
返回此set中最大的元素,严格小于给定元素,如果没有这样的元素,则返回null。
修改:查看您的代码,如果它在集合中,您似乎也希望返回targetDate
,这样您就可以使用floor(targetDate)
。
使用Guava,这是一个更高性能的单行:
Date earlierDate = Ordering.natural().max(
Iterables.filter(dates, Range.lessThan(targetDate)));
与纯Java方法不同,这不需要填充额外的数据结构,只需要一次传递列表。它会创建一个延迟填充的Iterable
,其中只包含小于targetDate
的日期,然后获取该可迭代的最大值。
同样,如果您希望它也接受targetDate
,请使用Range.atMost
代替Range.lessThan
。
答案 1 :(得分:0)
private Date getDateNearest(List<Date> dates, Date targetDate) {
Date returnDate = null; // Nearest before.
for (Date date : dates) {
if (date.before(targetDate) || date.equals(targetDate) {
if (returnDate == null || returnDate.before(date)) {
returnDate = date;
}
}
}
return returnDate;
}
您的错误:在targetDate上初始化returnDate会得到无与伦比的最接近的最佳值。 记住,也许:
return returnDate == null ? targetDate : returnDate;
BTW 4月1日? (编辑问题。)LOL
答案 2 :(得分:0)
这应该有帮助
private Date getDateNearest(List<Date> dates, Date targetDate) {
Date returnDate = targetDate;
long targetMillis = targetDate.getTime();
long mindiff = Long.MAX_VALUE;
for (Date date : dates) {
long dateMillis = date.getTime();
long diff = Math.abs(dateMillis-targetMillis);
if( diff < mindiff){
mindiff = diff;
returnDate = date;
}
}
return returnDate;
}