Collections容器中除了其排序方法之外,还有一个很重要的功能是搜索方法binarySearch()。binarySearch()有多种译法,如折半查找法、二进制搜索法、对半搜索法,我本人比较倾向于读为折半查找法,其基本思想是模拟人们查找字典的模式,即在查找某个字时通常将字典翻到中间一页,如果在该页则找到了该字,如果没有找到,则看该字的编号是在中间这一页之前还是之后,然后再在这一半中翻到其中间一页,继续查找,直到找到为止。Collections容器中实现了这一数据结构算法,其具体描述如下:
(1)public static <T> int binarySearch(List<? extends Comparable<? super T>> list ,T key)
使用折半查找算法来搜索指定列表,以获得指定对象。在进行此调用之前,必须根据列表元素的自然顺序 对列表进行升序排序。如果没有对列表进行排序,则结果是不明确的。如果列表包含多个等于指定对象的元素,则无法保证找到的是哪一个。其中,list
- 要搜索的列表,key
- 要搜索的键。 如果搜索键包含在列表中,则返回搜索键的索引;否则返回 (-(插入点) - 1)。如果列表中包含不可相互比较 的元素(例如,字符串和整数),或者搜索键无法与列表的元素进行相互比较,将会抛出ClassCastException - 错误。
(2)public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
这与上面的算法是一样的,只不过它是针对没有对列表进行排序的情形。相当于是集成了升序排序和折半查找功能。其中,c
- 排序列表的比较器。null 值指示应该使用的元素的自然顺序。
下面的代码便实现了一个简单的搜索功能。事先创建一个数组,然后将数组转化为列表,对列表中的某一元素进行查找,返回其索引值。代码如下:
import java.util.*;
public class SortTest {
public static void main(String[] args){
int[] a={1,2,-5,6,-88,45,6845,0,685};
int len=a.length;
Integer[] ab=new Integer[len];//Integer类封装了int型字段.其对象可以实现int和string的相互转化,以利于将数组转化为列表的操作
for(int i=0;i<len;i++)
{
ab[i]=a[i]; //将原始数组值赋给新数组.
}
List abList=Arrays.asList(ab);//将数组转化为列表
/**Arrays类包含了各种处理数组的方法,如排序和查找,也包含了将数组转化为列表的功能(lists),如Arrays.asList(ab);
* 之所以需要将其转化为列表,是Collections容器只能对列表对象进行排序.
* */
//sort as ascend
Collections.sort(abList);//根据元素的自然顺序 对指定列表按升序进行排序
System.out.println("Ascend Order is:");
for(int i=0;i<len;i++){
System.out.println(ab[i]);//打印升序后的列表
}
int k=Collections.binarySearch(abList,45);//折半查找
System.out.println("找到的答案是::"+k);
}
}
}