java list binary search_Collections里面的binarySearch方法

标签:

------Java培训、Android培训、ios培训、.Net培训、期待与您

交流!------

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 list=new ArrayList();

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 list=new ArrayList();

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 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提供给我的方法用起来都很方便,但是底层依然是基础的算法,可见算法是固定的。正在学习中的同学们

不要因为刚开始的困难就浅尝辄止哦,毕竟只知道用别人提供出来方法的人不会是大神。这是学习毕姥爷视屏的总结,盼

多多指导!!!

------Java培训、Android培训、ios培训、.Net培训、期待与您

交流!------

标签:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值