<T extends Comparable<? super T>> 分析:T表示任意字符名,
extends对泛型上限进行了限制即T必须是Comparable<? super T>的子类,
然后<? super T>表示Comparable<>中的类型下限为T(如果T的父类实现了Comparable接口,而
T没有实现,那么T也可以使用Comparable)
publicclassCollections{/**
* @ 实现list容器的lowe_bound 返回list容器第一个大于等于key的数的位置 不存在则返回-1
* @ param list
* @ param key
* @ return int
* @ create by ostreamBaba on 下午5:30 18-9-11
*/publicstatic <T> intlower_bound(List<? extends Comparable<? super T>> list,T key){
int low=0;
int high=list.size();
while (low<high){
int mid=(low+high)>>>1;
Comparable<? super T> midVal=list.get(mid);
int tmp=midVal.compareTo(key);
if(tmp<0){
low=mid+1;
}else{
high=mid;
}
}
return low==list.size()?-1:low;
}
/**
* @ 实现list容器的upper_bound 返回list容器第一个大于key的数的位置 不存在则返回-1
* @ param list
* @ param key
* @ return int
* @ create by ostreamBaba on 下午5:29 18-9-11
*/publicstatic <T> intupper_bound(List<? extends Comparable<? super T>> list,T key){
int low=0;
int high=list.size();
while (low<high){
int mid=(low+high)>>>1;
Comparable<? super T> midVal=list.get(mid);
int tmp=midVal.compareTo(key);
if(tmp<=0){
low=mid+1;
}else{
high=mid;
}
}
return low==list.size()?-1:low;
}
@Testpublicvoidtest(){
List<Integer> list=new ArrayList<Integer>(Arrays.asList(2,3,3,4,5));
assert lower_bound(list,3)==1;
assert lower_bound(list,6)==-1;
assert upper_bound(list,6)==-1;
}
}
普通数据类型 upper_bound和lower_bound
publicclassArrays {/**
* @ 查找数组中第一个大于等于target的数的位置 若找不到则返回-1
* @ param arr
* @ param target
* @ return int
* @ create by ostreamBaba on 下午2:58 18-9-11
*/publicstaticintlower_bound(int[] arr,int target){
int l=0;
int r=arr.length;
while (l<r){
int mid=l+(r-l)/2;
if(arr[mid]>=target){
r=mid;
}else{
l=mid+1;
}
}
return l==arr.length?-1:l;
}
/**
* @ 寻找数组中第一个大于target的数的位置 若找不到则返回-1
* @ param arr
* @ param target
* @ return int
* @ create by ostreamBaba on 下午2:59 18-9-11
*/publicstaticintupper_bound(int[] arr,int target){
int l=0;
int r=arr.length;
while (l<r){
int mid=l+(r-l)/2;
if(arr[mid]>target){
r=mid;
}else{
l=mid+1;
}
}
return l==arr.length?-1:l;
}
@Testpublicvoidtest(){
int[] a={2,3,4,4,5};
assert lower_bound(a,5)==4; //测试lower_boundassert upper_bound(a,4)==4; //测试upper_bound
}.
}