黑马程序员技术交流社区

标题: Collections.binarySearch的问题 [打印本页]

作者: 奔跑的二叉树    时间: 2013-9-11 00:03
标题: Collections.binarySearch的问题
本帖最后由 奔跑的二叉树 于 2013-9-11 00:12 编辑
  1. import java.util.*;
  2. public class CollectionsDemo {

  3.         public static void main(String[] args) {
  4.                 binarySearchDemo();
  5.         }
  6.         public static void binarySearchDemo()
  7.         {
  8.                 List<String> list =new ArrayList<String>();
  9.                 list.add("aafasdfsdfsa");
  10.                 list.add("bbdfa");
  11.                 list.add("acdd");
  12.                 list.add("sddfaxdd");
  13.                 sop(list);
  14.                
  15.                
  16.                 int index=Collections.binarySearch(list,"acdd");
  17.                 sop("binarySearch查找的index="+index);
  18.                
  19.                 int index1=halfSerach2(list,"acdd",new StrLenComparator());
  20.                 sop("我的二分法查找到的index为:"+index);
  21.         }
  22.         public static int halfSerach2(List<String> list,String key,Comparator<String> cmp)
  23.         {
  24.                 int max,min,mid;
  25.                 max=list.size();
  26.                 min=0;
  27.                 mid=(max+min)>>1;
  28.                 while(min<=max)
  29.                 {
  30.                         String str=list.get(mid);
  31.                         int num=cmp.compare(str, key);
  32.                         if(num>0)
  33.                                 max=mid-1;
  34.                         else if(num<0)
  35.                                 min=mid+1;
  36.                         else
  37.                                 return mid;
  38.                 }
  39.                 return -min-1;//返回-index-1
  40.         }
  41.                 public static void sop(Object obj)
  42.         {
  43.                 System.out.println(obj);
  44.         }

  45. }
  46. class StrLenComparator implements Comparator<String>
  47. {
  48.         public int compare(String s1,String s2)
  49.         {
  50.                 if(s1.length()>s2.length())
  51.                         return 1;
  52.                 if(s1.length()<s2.length())
  53.                         return -1;
  54.                 return s1.compareTo(s2);
  55.                        
  56.         }
  57. }
复制代码
按说是找不着才会返回一个负的啊


这个“acdd”怎么找不到呢,怎么会是-2呢,其他几个都是正数啊,这是什么情况呢?
作者: xiaoxu    时间: 2013-9-11 00:49
  1. import java.util.*;
  2. public class CollectionsDemo {

  3.         public static void main(String[] args) {
  4.                 binarySearchDemo();
  5.         }
  6.         public static void binarySearchDemo()
  7.         {
  8.                 List<String> list =new ArrayList<String>();
  9.                 list.add("aafasdfsdfsa");
  10.                 list.add("bbdfa");
  11.                 list.add("acdd");
  12.                 list.add("sddfaxdd");
  13.                 sop(list);
  14.                
  15.                 Collections.sort(list);//这里要先排序
  16.                 int index=Collections.binarySearch(list,"acdd");
  17.                 sop("binarySearch查找的index="+index);
  18.                
  19.                 int index1=halfSerach2(list,"acdd",new StrLenComparator());
  20.                 sop("我的二分法查找到的index为:"+index);
  21.         }
  22.         public static int halfSerach2(List<String> list,String key,Comparator<String> cmp)
  23.         {
  24.                 int max,min,mid;
  25.                 max=list.size()-1;//最大角标应该是size-1
  26.                 min=0;
  27.                 while(min<=max)
  28.                 {
  29.                                                 mid=(max+min)>>1;//这条语句应该在循环中
  30.                         String str=list.get(mid);
  31.                         int num=cmp.compare(str, key);
  32.                         if(num>0)
  33.                                 max=mid-1;
  34.                         else if(num<0)
  35.                                 min=mid+1;
  36.                         else
  37.                                 return mid;
  38.                 }
  39.                 return -min-1;//返回-index-1
  40.         }
  41.                 public static void sop(Object obj)
  42.         {
  43.                 System.out.println(obj);
  44.         }

  45. }
  46. class StrLenComparator implements Comparator<String>
  47. {
  48.         public int compare(String s1,String s2)
  49.         {
  50.                         //这儿不需要对长度进行判断
  51.                 return s1.compareTo(s2);
  52.                         
  53.         }
  54. }
复制代码
二分法查找最关键的一点一定要记住,查找的序列是有序的!!

作者: 奔跑的二叉树    时间: 2013-9-11 11:46
xiaoxu 发表于 2013-9-11 00:49
二分法查找最关键的一点一定要记住,查找的序列是有序的!!

鸡冻!写得好详细,灰常感谢,膜拜膜拜!!

作者: 奔跑的二叉树    时间: 2013-9-11 11:48
xiaoxu 发表于 2013-9-11 00:49
二分法查找最关键的一点一定要记住,查找的序列是有序的!!

最后那里为什么不需要对长度进行判断呢,我是想让人根据长度来进行排序的啊

作者: xiaoxu    时间: 2013-9-11 14:09
奔跑的二叉树 发表于 2013-9-11 11:48
最后那里为什么不需要对长度进行判断呢,我是想让人根据长度来进行排序的啊
...

你那方法是在根据长度进行查找,你如果要用这种方式查找,那你首先应该将序列进行这种方式的排序,Collections.sort()不是这种方式排序的,你可以自己写个方法先按你想要的方式进行排序





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