首页 > 代码库 > Collections里面的binarySearch方法
Collections里面的binarySearch方法
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、ios培训、.Net培训</a>、期待与您
交流!------
Collections里面的binarySearch方法
查阅API发现其返回值类型为:
如果搜索键包含在列表中,则返回搜索键的索引;否则返回 (-(插入点) - 1)。插入点 被定义为将键插入列表的那一点:
即第一个大于此键的元素索引;如果列表中的所有元素都小于指定的键,则为 list.size()。注意,这保证了当且仅当
此键被找到时,返回的值将 >= 0。
简单的代码事例如下:
import java.util.Collections;
import java.util.List;
public class binarySearchDemo
{
public static void main(String[] args)
{
List<String> list=new ArrayList<String>();
list.add("gha");
list.add("bcs");
list.add("asd");
list.add("zer");
Collections.sort(list);//对集合排序
sop(list);
int index=Collections.binarySearch(list,"asd");
sop("index="+index);
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
运行结果:
[asd, bcs, gha, zer]
index=0
从结果不难发现binarySearch(List<? extends Comparable<? super T>> list, T key)
方法找到的是key在集合中的位置index=0
如果要查找的key不存在呢?
我们只修改上面代码中的一句话
int index=Collections.binarySearch(list,"pppp");
运行结果如下:
[asd, bcs, gha, zer]
index=-4
API中说明了如果要找的key不存在返回 (-(插入点) - 1)
通过分析联想到这和二分查找有点像
index+1的绝对值就是该key插入的位置
那么Collections.binarySearch底层肯定调用了二分查找的方法,那么我们不再调用
binarySearch(List<? extends T> list, T key, Comparator<? super T> c) 方法,调用
自己写的折半查找方法也应该是可以的:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class binarySearchDemo
{
public static void main(String[] args)
{
List<String> list=new ArrayList<String>();
list.add("gha");
list.add("bcs");
list.add("asd");
list.add("zer");
Collections.sort(list);//对集合排序
sop(list);
int index=halfSearch(list,"asd");
sop("index="+index);
}
public static void sop(Object obj)
{
System.out.println(obj);
}
public static int halfSearch(List<String> list,String key)
{
int max,min,mid;
max=list.size()-1;
min=0;
while(min<=max)
{
mid=(max+min)/2;
String str=list.get(mid);
int num=str.compareTo(key);
if(num>0)
max=mid-1;
else if(num<0)
mid=max+1;
else
return mid;
}
return -min-1;
}
}
运行结果:
[asd, bcs, gha, zer]
index=0
和上面调用binarySearch结果一致。所以说Colltions底层调用了折半查找的基础算法
总结:虽然Java提供给我的方法用起来都很方便,但是底层依然是基础的算法,可见算法是固定的。正在学习中的同学们
不要因为刚开始的困难就浅尝辄止哦,毕竟只知道用别人提供出来方法的人不会是大神。这是学习毕姥爷视屏的总结,盼
多多指导!!!
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、ios培训、.Net培训</a>、期待与您
交流!------
Collections里面的binarySearch方法