本人新手,对于Arrays.sort和Arrays.binarySearch,还是没完全吃透贴上代码,在其中请教高手三个问题:----先谢谢!import java.util.*;
public class VLA implements Comparator<VLA> {
 
int dishSize;
 
 public static void main(String[] args) {
 VLA[] va = {new VLA(40), new VLA(200), new VLA(60)};

//  Arrays.sort(va); //问题一:这样写,为什么会抛java.lang.ClassCastException异常;
 Arrays.sort(va,va[0]);
 for(VLA v: va) System.out.print(v.dishSize + " ");
/*
 * 问题二:binarySearch方法中的参数,Comparator<? super T> c)怎么理解?
 * 是实现了Comparator接口的任意一个对象么?
 * public static <T> int binarySearch(T[] a, T key, Comparator<? super T> c)
 * 问题三:
 * 这第三个参数为什么不能为空?
 * API写着,第三个参数为null,是按自然序列排序,但运行时会抛java.lang.ClassCastException异常;
*/
//  int index = Arrays.binarySearch(va, new VLA(60), null);
 
 int index = Arrays.binarySearch(va, new VLA(60), new VLA(1));
 System.out.println(index);
 }
 
 public int compare(VLA a, VLA b) {
 return a.dishSize - b.dishSize;
 }
 
  VLA(int d) { dishSize = d; }
}异常binarySearch Arrays

解决方案 »

  1.   

    第一个问题:sort(T[] a,Comparator<? super T> c)里如果不指定Comparator,那么就以自然顺序排序,如API所说:
    Sorts the specified list into ascending order, according to the natural ordering of its elements. All elements in the list must implement the Comparable interface
    这里的自然顺序就是实现Comparable接口设定的排序方式。你用sort方法时候没有传入集合比较器,也没有重写自身的compareto(),所以集合里面的元素是不可比较的,会抛出ClassCastException异常。第二个问题:这样的说发应该没错第三个问题:没有给集合一个比较器,集合里面的元素是类,元素之间是不可比较的,所以会抛出异常
      

  2.   

    你这样写实现compareto()会引起混淆的,Comparable 是在集合内部定义的方法实现的排序,具体实现:package csdn.programbbs_606;import java.util.*;public class VLA implements Comparable<VLA> {
    int dishSize;
    public static void main(String[] args) {
    VLA[] va = { new VLA(40), new VLA(200), new VLA(60) };
    Arrays.sort(va);
    for (VLA v : va)
    System.out.print(v.dishSize + " ");
    }
    VLA(int d) { dishSize = d; }
    @Override
    public int compareTo(VLA o) {
    return this.dishSize - o.dishSize;
    }
    }Comparator 是在集合外部实现的排序,具体实现:package csdn.programbbs_606;import java.util.*;public class VLA {
    int dishSize;
    public static void main(String[] args) {
    VLA[] va = { new VLA(40), new VLA(200), new VLA(60) };
    Arrays.sort(va, new AbsComparato());
    for (VLA v : va)
    System.out.print(v.dishSize + " ");
    int index = Arrays.binarySearch(va, new VLA(200), new AbsComparato());
    System.out.println(index);
    }
    VLA(int d) { dishSize = d; }
    }class AbsComparato implements Comparator<VLA>{
    @Override
    public int compare(VLA o1, VLA o2) {
    return o1.dishSize - o2.dishSize;
    }
    }
      

  3.   

    你说的第三个参数为null,是按自然序列排序,是要集合里面的元素是可以比较的元素,如下:package csdn.programbbs_606;import java.util.Arrays;
    import java.util.Comparator;public class SortTest {
    public static void main(String[] args) {
    Integer a[] = {6, 3, 5, 9, 1};
    Arrays.sort(a, null);
    for(Integer i : a)
    System.out.print(i + " ");
    }
    }
    class sComparato implements Comparator<Integer>{
    @Override
    public int compare(Integer o1, Integer o2) {
    return o1 - o2;
    }
    }