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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Collections.sort(list,new StrLenComparator());先通过sort方法对list通过指定的比较器排序后,使用Collections.binarySearch(list,"aa",new StrLenComparator());为什么还要再传入一次比较器?
我把比较器去掉之后Collections.binarySearch(list,"aa");运行结果是一样的!(因为sort已经按照指定比较器拍好顺序了。)
如果不使用sort排序,直接使用Collections.binarySearch(list,"aa",new StrLenComparator());得到的结果是不正确的。
那带比较器的binarySearch方法具体是怎么用啊!?

请小伙伴写个static <T> int binarySearch(List<? extends T>list, T key,Comparator<?super T> c); 这个的实际用法的示例代码~~

桑克油~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{:soso_e191:}

评分

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

查看全部评分

14 个回复

倒序浏览
  1. public static void main(String[] args) {
  2.                 // TODO Auto-generated method stub
  3.                
  4.                 List<Integer> l1=new ArrayList<Integer>();
  5.                 l1.addAll(Arrays.asList(1,2,3,4));
  6.                 System.out.print(Search(l1,2));//使用binarySearch搜索列表
  7.         }
  8.         @SuppressWarnings("unchecked")
  9.         public static <T> int Search(List<T> list,T key)
  10.         {
  11.     //记录索引
  12.                 int index=0;
  13.                 index=Collections.binarySearch(list, key,new Comparator(){
  14.                         @Override
  15.                         public int compare(Object o1, Object o2) {
  16.                                 // TODO Auto-generated method stub
  17.                                 if(o1.equals(o2))
  18.                                 {
  19.                                         return 0;
  20.                                 }
  21.                                 return -1;
  22.                                
  23.                         }
  24.                 });
  25.                 return index;
  26.         }
复制代码

评分

参与人数 1黑马币 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
杨文越 发表于 2013-11-4 16:21
我也不懂,就自己查了下文档,写了写试试,不知道对你有没有帮助。已经搜索到 ...

{:soso_e135:}没帮助!而且没有接替层次感,标识符命名也没有意义。阅读性极差!

负分!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
回复 使用道具 举报

干嘛粘一段代码过来!?

你想做什么!?
回复 使用道具 举报
你这个是2个问题。。。
1.BinarySearch这个叫二分法查询算法,是说对于一个有序的集合,通过每次从中间查询以提升查询效率,
比如1.2.3.4.5.6.7.8.9 你要查8,他的查询顺序是:5.7.8
所以集合的有序性是前提
2.Comparator和Comparable这对难兄难弟的问题,凡是重载方法有Comparator的,一定有一个默认是使用Comparable排序算法的
如果你不想用Comparable的算法,比如1.2.3.4.5.6.7.8.9,你非要排成1.3.5.7.9.2.4.6.8
那就只能自定义一个Comparator的排序算法(Compare方法吧好像是),
那如果你的集合是用自定义排序算法的,想用二分法查找必须告诉人家你是怎么排序的吧,要不他怎么知道该怎么查

评分

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

查看全部评分

回复 使用道具 举报
零下五度的水 发表于 2013-11-4 18:43
你这个是2个问题。。。
1.BinarySearch这个叫二分法查询算法,是说对于一个有序的集合,通过每次从中间查询 ...

冰锅...
按照比较器排序了之后,不管传不传比较器结果是一样的,那传入比较器这个参数是起什么作用?
回复 使用道具 举报
呆萌 中级黑马 2013-11-4 19:54:31
7#
杨文越 发表于 2013-11-4 17:19
类名随便定义的   a类实现了comparator接口  复写了compare方法(可以无视)   主函数定义一个list   ...

汗P啊!!!!我就是没懂,怎样!?
回复 使用道具 举报
冰锅... ............................ 凸-_-凸
方法之间是不互相依赖的,
Collections.binarySearch只负责接收一个集合,他根本就不管你在调用它之前是不是排序了,反正爷直接默认你是排序的就好了
二分法本身是说:
取集合最中间的那个元素跟你想找的那个元素(目标元素)比,如果大于目标元素则向后搜索,否则向前搜索
去向后/向前中最中间的元素继续比,然后不停重复直到找到目标元素
那它必须要知道该怎么比吧,这就是Comparator要干的事

点评

赞个喵!!  发表于 2013-11-5 00:09

评分

参与人数 1技术分 +1 收起 理由
To + 1 赞一个!

查看全部评分

回复 使用道具 举报
呆萌 中级黑马 2013-11-4 22:00:52
9#
零下五度的水 发表于 2013-11-4 21:20
冰锅... ............................ 凸-_-凸
方法之间是不互相依赖的,
Collections.binarySearch只负责 ...

那我使用二分查找前不排序,然后用带比较器的二分查找,得不到正确的结果!
冰哥  你怎么看!?
回复 使用道具 举报
Collections.binarySearch只负责接收一个集合,他根本就不管你在调用它之前是不是排序了,反正爷直接默认你是排序的就好了
你不排序他也是这么个找法,只是给出什么结果不做保证,有序数列是二分法的前提,它只是个算法,你想跟他混就得照他的规矩来

比如给你本字典,让你用二分法查"门"字,你就得琢磨门是M打头,大概是字典的中间的样子,然后翻到中间一看,那写的都是A打头的,
二分法可不管这编字典的是不是跟他过不去,他想的是:M>A,我该往后翻,然后在后半本字典里又翻一半,
假设这时候正好碰上"门"字了,行了,完事,收工
要是一直没碰上,它就告诉你,这字典里没这个字

点评

!  发表于 2013-11-5 00:11
回复 使用道具 举报
呆萌 发表于 2013-11-4 17:18
干嘛粘一段代码过来!?

你想做什么!?

您不是要一个实例程序么,我就写了一个函数,不知道能不能帮助得到您。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马