java中一个List里放有若干个Date类型对象,如何最快找出离当前系统日期最近的那个,求教。

RT

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Random;

public class Test {
public static void main(String[] args) {
List<Date> list=new ArrayList<Date>();
Random ra=new Random();
for(int i=0;i<100;i++){
long n=ra.nextLong();
if(n<0){
n=-n;
}
n%=1600000000000L;
list.add(new Date(n));
}
for(Date t:list){
System.out.println(t);
}
System.out.println(">>>>>>>>>>>"+find1(list,new Date()));
System.out.println(">>>>>>>>>>>"+find2(list,new Date()));
}

/**
 * 搜索离得最近的日期, 先排序再搜索, 修改下适合进行大量的快速搜索
 * @param list
 * @param d
 * @return
 */
private static Date find1(List<Date> list,Date d){
if(list==null || list.size()<=0){
return null;
}
if(list.size()==1){
return list.get(0);
}
list=new ArrayList<Date>(list);
Collections.sort(list);

int left=0;
int right=list.size()-1;
while(left<=right){
int mid=(left+right)/2;
int cm=d.compareTo(list.get(mid));
if(cm<0){
right=mid-1;
}
else if(cm>0){
left=mid+1;
}
else{
return list.get(mid);
}
}
if(left<=0){
return list.get(0);
}
if(left>=list.size()){
return list.get(list.size()-1);
}
long dleft=d.getTime()-list.get(left-1).getTime();
long dright=list.get(left).getTime()-d.getTime();
return dleft<dright?list.get(left-1):list.get(left);
}


/**
 * 搜索离得最近的日期.适合只进行一次的快速搜索.
 * @param list
 * @param d
 * @return
 */
private static Date find2(List<Date> list,Date d){
if(list==null || list.size()<=0){
return null;
}
long gap=Long.MAX_VALUE;
Date r=null;
long time=d.getTime();
for(Date t:list){
long tm=Math.abs(time-t.getTime());
if(gap>tm){
gap=tm;
r=t;
}
}
return r;
}
}

看代码

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-06-03
挨个比较,用2个临时变量,一个存当前最近的时间,一个存当前最小的时间差,如果有更小的时间差,就用来替换这个2个变量,一遍循环搞定。
第2个回答  2013-06-03
List 里面的Date 没有排序,所以循环一遍挨个比较最快追问

挨个跟当前时间比只能得出一个时间差,是不是就是说我要对这个差值进行排序?

追答

不用,你只要离当前时间最近的,所以只保存这个最小值和对应的Date就可以了

第3个回答  2017-11-15
public class Test {
public static void main(String[] args) {
List<Date> dateList = new ArrayList<>();
dateList.add(DateUtil.stringToDate("2017-11-15 05:55:55"));
dateList.add(DateUtil.stringToDate("2017-11-12 05:55:55"));
dateList.add(DateUtil.stringToDate("2017-11-10 05:55:55"));
System.out.println(Collections.max(dateList));
System.out.println(Collections.min(dateList));
}
}

第4个回答  2013-06-03
直接找出list的最大日期和最小日期和系统时间比较不是来得更快吗?