黑马程序员技术交流社区

标题: 一个关于Collections的问题,求解惑! [打印本页]

作者: 王凯路路    时间: 2014-7-31 18:28
标题: 一个关于Collections的问题,求解惑!
  1. import java.util.*;
  2. class CollectionsDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 binarySearchDemo();
  7.         }
  8.         //不理解啊!
  9.         public static void binarySearchDemo()
  10.         {
  11.                 List<String> list = new ArrayList<String>();

  12.                 list.add("abcd");
  13.                 list.add("aaa");
  14.                 list.add("z");
  15.                 list.add("kkkkk");
  16.                 list.add("qq");

  17.                 //Collections.sort(list);

  18.                 sop(list);
  19.                 int index = Collections.binarySearch(list,"aaa");
  20.                 //int index = halfSearch(list,"aaa");
  21.                 sop(index);
  22.         }
  23. }
复制代码


毕老师在视频里, Collections.binarySearch(list,"aaa") 返回的应该是-1,但是那是在排序的情况下.
然后我把sort()方法注释掉后,返回的值为什么就成了-2呢 ?  -2不是代表没有找到么?但是集合里确实有啊.
作者: 我为你着迷    时间: 2014-7-31 18:35
没看懂表达的是啥意思
作者: 格子、    时间: 2014-7-31 18:43
Collections.binarySearch的方法在使用的时候是必须先对集合里的元素进行自然排序的,如果排序不固定的话返回的值就不一定了!我把代码修改了一下,楼主可以参考一下
  1. package day04;

  2. import java.util.*;

  3. class CollectionsDemo {
  4.         public static void main(String[] args) {
  5.                 binarySearchDemo();
  6.         }

  7.         // 不理解啊!
  8.         public static void binarySearchDemo() {
  9.                 List<String> list = new ArrayList<String>();

  10.                 list.add("abcd");
  11.                 list.add("aaa");
  12.                 list.add("z");
  13.                 list.add("kkkkk");
  14.                 list.add("qq");
  15.                 //先打印一下集合看是否存进去了
  16.                 System.out.println(list);
  17.                 //对集合元素进行排序
  18.                 Collections.sort(list);
  19.                 //打印排序后的集合
  20.                 System.out.println(list);
  21.                 //调用binarySearch方法之前必须先排序,否则结果不确定!!!
  22.                 int index = Collections.binarySearch(list, "aaa");
  23.                 // int index = halfSearch(list,"aaa");
  24.                 System.out.println(index);
  25.         }
  26. }
复制代码

楼主,这种疑问以后最好先查看帮助文档,这些文档里都有说明哦!!!
作者: yuli2039    时间: 2014-7-31 19:14
楼主自己去看  折半查找!!!所查找的集合或者数组必须有序!!Collections.sort()方法就是排序用的
作者: 乐此不疲    时间: 2014-7-31 19:30
本帖最后由 乐此不疲 于 2014-7-31 19:34 编辑

The list must be sorted into ascending order according to the natural ordering of its elements (as by the sort(List) method) prior to making this call. If it is not sorted, the results are undefined."意为使用二分法必须升序排列,否则结果不确定。
作者: 戒风    时间: 2014-7-31 19:50
我是来学习知识的
作者: 怀念黑海岸    时间: 2014-7-31 20:44
使用二分法查找的前提是你要进行查找操作的容器必须是有序的,sort方法就是对容器中元素进行排序,你注释掉了sort方法你如何保证容器中元素的有序性呢,于是就产生了你这样子的结果了。
作者: 王凯路路    时间: 2014-8-1 15:03
格子、 发表于 2014-7-31 18:43
Collections.binarySearch的方法在使用的时候是必须先对集合里的元素进行自然排序的,如果排序不固定的话返 ...

我知道排序后可以查到,    但是现在我想知道的是,  不排序为什么就找不到?  不过顺序多乱, 它都是确实存在的吧?不管怎么说也不能返回-2啊
作者: 王凯路路    时间: 2014-8-1 15:04
谢谢大家了,  我懂了...是我忽略了折半查找......




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2