我现在自己定一个折半查找 方法写好了 运行通过了 发现角标有的对 有的不对
而且 我用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:}
|