Collections容器的搜索方法

    Collections容器中除了其排序方法之外,还有一个很重要的功能是搜索方法binarySearch()。binarySearch()有多种译法,如折半查找法、二进制搜索法、对半搜索法,我本人比较倾向于读为折半查找法,其基本思想是模拟人们查找字典的模式,即在查找某个字时通常将字典翻到中间一页,如果在该页则找到了该字,如果没有找到,则看该字的编号是在中间这一页之前还是之后,然后再在这一半中翻到其中间一页,继续查找,直到找到为止。Collections容器中实现了这一数据结构算法,其具体描述如下:

(1)public static  int binarySearch(List> list ,T key)

    使用折半查找算法来搜索指定列表,以获得指定对象。在进行此调用之前,必须根据列表元素的自然顺序 对列表进行升序排序。如果没有对列表进行排序,则结果是不明确的。如果列表包含多个等于指定对象的元素,则无法保证找到的是哪一个。其中,list - 要搜索的列表,key - 要搜索的键。 如果搜索键包含在列表中,则返回搜索键的索引;否则返回 (-(插入点) - 1)。如果列表中包含不可相互比较 的元素(例如,字符串和整数),或者搜索键无法与列表的元素进行相互比较,将会抛出ClassCastException - 错误。

(2)public static int binarySearch(List list, T key,  Comparator 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     {
       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      System.out.println(ab[i]);//打印升序后的列表
     }
     int k=Collections.binarySearch(abList,45);//折半查找
     System.out.println("找到的答案是::"+k);
     
         
     
 }
  
  
    }
}

 

你可能感兴趣的:(Collections容器的搜索方法)