日期:2014-05-20  浏览次数:20713 次

帮忙解读代码:Arrays.sort和Arrays.binarySearch抛异常
本人新手,对于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

------解决方案--------------------
第一个问题: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异常。

第二个问题:这样的说发应该没错

第三个问题:没有给集合一个比较器,集合里面的元素是类,元素之间是不可比较的,所以会抛出异常
------解决方案--------------------
你这样写实现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;