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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 殷婷婷 中级黑马   /  2013-11-15 10:41  /  984 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 殷婷婷 于 2013-11-15 12:11 编辑
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.Comparator;
  4. import java.util.List;


  5. public class Test {

  6.         public static void main(String[] args) {
  7.                 // TODO Auto-generated method stub
  8.                 List<String> list = new ArrayList<String>();
  9.                 list.add("java");
  10.                 list.add("demo");
  11.                 list.add("yinyi");
  12.                 list.add("zo");
  13.                 list.add("demo");
  14.                 Collections.sort(list,new StrLenComparator1());
  15.                 System.out.println(list);
  16.                 System.out.println(halfSearch2(list,"zo",new StrLenComparator1()));
  17.         }
  18.         public static int halfSearch2(List<String> list,String key,Comparator<String> cmp)
  19.         {
  20.                 int min,max,mid;
  21.                 max = list.size()-1;
  22.                 min = 0;
  23.                 while(min<=max)
  24.                 {
  25.                         mid = (min+max)>>1;
  26.                         String str = list.get(mid);
  27.                         int num = cmp.compare(str,key);
  28.                         if(num>0)
  29.                                 max = mid - 1;
  30.                         if(num<0)
  31.                                 min = mid + 1;
  32.                         else return mid;
  33.                 }
  34.                 return -min-1;
  35.         }
  36. }
  37. class StrLenComparator1 implements Comparator<String>
  38. {
  39.         public int compare(String s1,String s2)
  40.         {
  41.                 if(s1.length()>s2.length()) return 1;
  42.                 if(s1.length()<s2.length()) return -1;
  43.                 return s1.compareTo(s2);
  44.         }
  45. }
  46.         
复制代码
按照二分搜索法排序,System.out.println(halfSearch2(list,"zo",new StrLenComparator1()));的结果应该是0,可是运行了下,输出是2,实在找不出哪里错了,用binarySearch(list,"zo",new StrLenComparator()))输出的是正确的,肯定是程序哪儿写错了,麻烦帮我看一下,到底是哪儿的错。

评分

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

查看全部评分

4 个回复

倒序浏览
我们来分析下下面的代码,第一次执行循环时如下
while(min<=max)
                {
                        mid = (min+max)>>1;//mid =2
                        String str = list.get(mid);//str的值为"demo"
                        int num = cmp.compare(str,key);//返回值大于0即num>0
                        if(num>0)//这个if语句会执行num>0
                                max = mid - 1;//max=1
                        if(num<0)//这个if不会执行,所以他后面的else会执行
                                min = mid + 1;
                        else return mid;//返回mid即2
                }

你的第二个if语句应该是else if。
回复 使用道具 举报
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.Comparator;
  4. import java.util.List;


  5. public class Test {

  6.         public static void main(String[] args) {
  7.                 // TODO Auto-generated method stub
  8.                 List<String> list = new ArrayList<String>();
  9.                 list.add("java");
  10.                 list.add("demo");
  11.                 list.add("yinyi");
  12.                 list.add("zo");
  13.                 list.add("demo");
  14.                 Collections.sort(list,new StrLenComparator1());
  15.                 System.out.println(list);
  16.                 System.out.println(halfSearch2(list,"zo",new StrLenComparator1()));
  17.         }
  18.         public static int halfSearch2(List<String> list,String key,Comparator<String> cmp)
  19.         {
  20.                 int min,max,mid;
  21.                 max = list.size()-1;
  22.                 min = 0;
  23.                 while(min<=max)
  24.                 {
  25.                         mid = (min+max)>>1;
  26.                         String str = list.get(mid);
  27.                         int num = cmp.compare(str,key);
  28.                         if(num>0)
  29.                                 max = mid - 1;
  30.                         else if(num<0)  //少写了一个else   //如果比较值是大于0的数,在上面的if比较后 ,又在此if比较,由于num大于0,所以执行else 程序结束输出返回值2;
  31.                                 min = mid + 1;
  32.                         else return mid;
  33.                 }
  34.                 return -min-1;
  35.         }
  36. }
  37. class StrLenComparator1 implements Comparator<String>
  38. {
  39.         public int compare(String s1,String s2)
  40.         {
  41.                 if(s1.length()>s2.length()) return 1;
  42.                 if(s1.length()<s2.length()) return -1;
  43.                 return s1.compareTo(s2);
  44.         }
  45. }
  46.         
复制代码
回复 使用道具 举报
linjl_ll 发表于 2013-11-15 11:03
我们来分析下下面的代码,第一次执行循环时如下
while(min>1;//mid =2
                        String str ...

是的哦,谢谢啦,哈哈:victory:
回复 使用道具 举报

谢谢帮助啊:victory:
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马