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>、期待与您
交流!------

时间: 2024-08-10 15:10:08

Collections里面的binarySearch方法的相关文章

Android Service生命周期 Service里面的onStartCommand()方法详解

2014-10-21 23:40 32人阅读 评论(0) 收藏 举报 在Demo上,Start一个Service之后,执行顺序:onCreate - > onStartCommand 然后关闭应用,会重新执行上面两步. 但是把代码拷贝到游戏工程发现,关闭游戏后,只执行了onStart,却没有执行onStartCommand! 查找到下面的文章: [plain] view plaincopy Service里面的onStartCommand()方法详解 启动service的时候,onCreate方

我错误的去试图用QList里面的at方法改变const常量的值

在做曲线工厂的程序的时候,我写了一行代码是这样的: AllLines.at(cruveSecions).p1().setY(20); AllLines是QList<QLineF>类型的,cruveSections是int类型的,这里我犯了一个很低级但是很容易犯的错误,我本是图个方便,然后导致AllLines里面的数据老是更新不了,我很纳闷,最后同事通过查API给我找出了错误的原因.是这样的QList里面通过at访问出来的是个常量,里面的值不能修改成功,但是我很纳闷编译器也不报错,我想可能是se

Angularjs $scope 里面的$apply 方法 和 $watch 方法

Angularjs $scope 里面的$apply 方法 和 $watch 方法 学习要点:1. Angularjs $scope 里面的$apply 方法2. Angularjs $scope 里面的$watch 方法 1. Angularjs $scope 里面的$apply 方法$apply 方法作用:Scope 提供$apply 方法传播 Model 的变化$apply 方法使用情景:AngularJS 外部的控制器( DOM 事件.外部的回调函数如 jQuery UI 空间等)调用了

java.lang.String里面的trim()方法——删除首尾空格

结果如图 package com.softeasy.test1; public class String_trim { public static void main(String[] args) { String str = " slkjfsj sdfjf jsjs "; System.out.println("没有用trim()方法前str为:|" + str + "|"); str = str.trim(); System.out.prin

java 里面的 native 方法

第一篇: 今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解. 一. 什么是Native Method   简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C.这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数.   

datagrid 里面的formatter方法

A.{field:'station_staus',title:'工位状态',width:250,align:'center',formatter: function(value,row,index){ if (row.station_staus==0){ return "现实"; } if(row.station_staus==1){ return "虚拟"; } }}, B.function(value, row, index) { return "&l

改造已有的A类里面的aa方法

    继承 写一个类继承A类,改造aa方法,必须保证A类没有子类,才能用继承改造方法.如果已经有了一个A类对象了,用继承是不能改造已有的A类对象.    装饰 写一个类实现和A类相同的接口,保证装饰者和被装饰者具有相同的方法.提供构造方法,允许用户在构造装饰者对象时候把被装饰者得对象传入,对不想改造的方法调用原A类的方法,对想改造得方法自己去写就可以了.   动态代理 已经有了A类的一个对象了,对其中的aa方法不满意.创建一个代理对象,代理对象直接调用A类中不需要改造的方法,代理者自己写一个方

Service里面的onStartCommand()方法详解

启动service的时候,onCreate方法只有第一次会调用,onStartCommand和onStart每次都被调用.onStartCommand会告诉系统如何重启服务,如判断是否异常终止后重新启动,在何种情况下异常终止 onStartCommand和onStart区别 // This is the old onStart method that will be called on the pre-2.0 // platform. On 2.0 or later we override on

es6里面的arr方法

es6里面,关于arr的遍历以及查找,新增了很多的方法,对于不同的应用场景,运用合适的方法,可以达到事半功倍的效果: 一, arr.find():用于查找到符合条件的第一个成员,如果没有查找到的话,则返回undefined: var arr = [1,2,3,-4,-2,9]; arr.find(item => item < 0) ; ---- -4 arr.find(item => item > 10); -----undefined 二, arr.findIndex():用于查