帮忙解读代码: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; }
}
------解决方案--------------------第一个问题: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;