我希望知道如何输入一个方法来给我一个指定日期的最接近日期。我的意思是以下内容:
public Date getNearestDate(List<Date> dates, Date currentDate) {
return closestDate // The date that is the closest to the currentDate;
}
我发现了类似的问题,但只有一个有一个很好的答案,代码一直给我NullPointerExceptions ... 任何人都可以帮助我吗?
答案 0 :(得分:14)
您可以通过计算时间差异(例如Date#getTime()
)并返回最小值来解决线性时间问题:
public static Date getNearestDate(List<Date> dates, Date currentDate) {
long minDiff = -1, currentTime = currentDate.getTime();
Date minDate = null;
for (Date date : dates) {
long diff = Math.abs(currentTime - date.getTime());
if ((minDiff == -1) || (diff < minDiff)) {
minDiff = diff;
minDate = date;
}
}
return minDate;
}
<强> [编辑] 强>
轻微的性能改进。
答案 1 :(得分:3)
使用Date#getTime并减去值。最小的结果将是您最近的日期。
答案 2 :(得分:2)
按日期顺序排列列表并执行二分法搜索。请记住,要比较日期,您可以使用Date.getTime()将日期作为毫秒,这通常更容易比较。
答案 3 :(得分:0)
您可以按最近的顺序订购日期。
将开始日期设置为0:
long ret = 0;
现在您需要循环浏览列表并保持最接近所需日期
for(Date d : dates){
if(Math.abs(curDate.getTime() - ret) > Math.abs(curDate.getTime() - d.getTime())){
ret = d.getTime();
}
}
return new Date(ret);
if
语句通过比较毫秒时间来检查哪个日期更近。通过使用Math.abs,您可以消除方向(在之前或之后)。