帮忙解读代码:Arrays.sort和Arrays.binarySearch抛异常

TheQueenOfJava 2013-06-06 11:23:59
本人新手,对于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; }
}
...全文
207 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
TheQueenOfJava 2013-06-07
  • 打赏
  • 举报
回复
非常感谢!我懂了
地下室森林 2013-06-06
  • 打赏
  • 举报
回复
你说的第三个参数为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;
	}
}
地下室森林 2013-06-06
  • 打赏
  • 举报
回复
你这样写实现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;
	}
}
地下室森林 2013-06-06
  • 打赏
  • 举报
回复
第一个问题: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异常。 第二个问题:这样的说发应该没错 第三个问题:没有给集合一个比较器,集合里面的元素是类,元素之间是不可比较的,所以会抛出异常

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧