黑马程序员技术交流社区
标题:
各位大神求看 继续是查找的问题
[打印本页]
作者:
kira
时间:
2014-1-27 17:34
标题:
各位大神求看 继续是查找的问题
我现在自己定一个折半查找 方法写好了 运行通过了 发现角标有的对 有的不对
而且 我用Collcetions.sort方法里面传比较器能用
我在我的方法里传比较器 比较的却还是默认比较器的比较方式
我的比较方式是按照字符串长度排序
下面是我的代码
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class ListDemoC {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> arraylist = new ArrayList<String>();
arraylist.add("java");
arraylist.add("hello");
arraylist.add("www");
// maxShow();
int i1 =myHalfSearch(arraylist,"ww",new mycomHalf());
System.out.println(arraylist);
System.out.println(i1);
Collections.sort(arraylist, new mycomHalf());
System.out.println(arraylist);
}
public static void maxShow(){//原先的折半查找
List<String> al = new ArrayList<String>();
al.add("java");
al.add("hello");
al.add("www");
String s = Collections.max(al);
int i = Collections.binarySearch(al, "java");
System.out.println(al);//打印最大值
System.out.println(i);//打印角标数
}
//制造我自己的折半查找的方法
public static int myHalfSearch(List<String> list,String key,mycomHalf com){
int max,min,mid;
max = list.size()-1;
min=0;
while(min<=max){
mid=(max+min)>>1;//这句话相当于相加除以2
//获取到中间的角标
String s = list.get(mid);//已经获取到中间角标
int num= com.compare(s, key);//比较一下
if(num>0){
max = mid-1;
}
else if(num<0){
min = mid+1;
}
else{
return mid;
}
}
return -min-1;//返回插入点-1
}
}
class mycomHalf implements Comparator<String>{//我自己的比较器
public int compare(String s1, String s2) {
return new Integer(s1.length()).compareTo(new Integer(s2.length()));//按照长度进行比较
// TODO Auto-generated method stub
}
}
复制代码
我验证了一下 当传入java 和hello的时候 角标没错 但传入了www角标却不正确了
而且 还有我的方法没有实现我自己比较器的比较方式 Collcetions.sort方法传入的比较器却成功了 这是为什么呢 求指教{:soso_e136:}
作者:
zhangchao
时间:
2014-1-27 21:00
折半查找是有前提的,要保证查找的源必须是有序的,你给出的代码就不具备此前提,何谈折半呢?
另外打开你的maxShow()函数打印的角标也不对,原理上这个运行也对不了。
如有不当,请指正
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2