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;
}
}
看代码