A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

复习到Collcetions的binarySearch这块了
结果 二分查找的时候 有个实例 着实让人不明白
下面随便写了个示例代码
  1. import java.util.ArrayList;
  2. import java.util.Collection;
  3. import java.util.Collections;
  4. import java.util.List;

  5. public class ListDemoC {

  6.         /**
  7.          * @param args
  8.          */
  9.         public static void main(String[] args) {
  10.                 // TODO Auto-generated method stub
  11.                
  12.                 maxShow();//调用方法
  13.                
  14.         }
  15.         public static void maxShow(){
  16.                 List<String> al = new ArrayList<String>();
  17.                 al.add("java");
  18.                 al.add("hello");
  19.                 al.add("www");
  20.                 String s = Collections.max(al);
  21.                 int i = Collections.binarySearch(al, "java");
  22.         System.out.println(al);//打印最大值
  23.                 System.out.println(i);//打印角标数
  24.         }

  25. }
复制代码
这里打印集合就不多说了 但我获取到的角标却是-3
这个很不科学 为了验证下 我这方法 我又search了下WWW结果这次是2 对了
求教 为什么这里我获取的首元素角标却成了不存在 而且还是-3呢
如果我想让它获取到角标0的话 该怎么改 {:soso_e136:}


评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

2 个回复

倒序浏览
试了楼主的源码,发现确实是这种情况,自己找了半天都没发现原因,特地去查了API文档,终于知道答案:

使用二分搜索法搜索指定列表,以获得指定对象。在进行此调用之前,必须根据列表元素的自然顺序对列表进行升序排序(通过 sort(List) 方法)。如果没有对列表进行排序,则结果是不确定的。如果列表包含多个等于指定对象的元素,则无法保证找到的是哪一个。

源码修改如下:
  1. import java.util.ArrayList;
  2. import java.util.Collection;
  3. import java.util.Collections;
  4. import java.util.List;

  5. public class Demo2 {

  6.         /**
  7.          * @param args
  8.          */
  9.         public static void main(String[] args) {
  10.                 // TODO Auto-generated method stub
  11.                
  12.                 maxShow();//调用方法
  13.                
  14.         }
  15.         public static void maxShow(){
  16.                 List<String> al = new ArrayList<String>();
  17.                 al.add("java");
  18.                 al.add("hello");
  19.                 al.add("www");
  20.                 //String s = Collections.max(al);
  21.                 Collections.sort(al);//进行升序排列
  22.                 int i = Collections.binarySearch(al, "java");
  23.                 int j = Collections.binarySearch(al, "hello");
  24.                 System.out.println(al);//排列后的结果
  25.                 System.out.println(i);//打印角标数
  26.                 System.out.println(j);//打印角标数
  27.         }

  28. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 很给力!

查看全部评分

回复 使用道具 举报
贺奕凯 发表于 2014-1-28 23:25
试了楼主的源码,发现确实是这种情况,自己找了半天都没发现原因,特地去查了API文档,终于知道答案:

使 ...

大神!!! 太感谢了 我去试试
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马