实现Comparator 排序时异常

surongr 2012-07-09 02:41:48
类如下
public static class __9_7_Person implements Comparator<__9_7_Person> {
private int height;
private int weight;
public __9_7_Person(int height, int weight) {
this.height = height;
this.weight = weight;
}
public int compare(__9_7_Person p1, __9_7_Person p2) {
if (p1.height != p2.height) {
return p1.height - p2.height;
}
else {
return p1.weight - p2.weight;
}
}
}

创建对象如下
__9_7_Person p[] = {new __9_7_Person(60, 100),
new __9_7_Person(70, 150),
new __9_7_Person(56, 90),
new __9_7_Person(75, 190),
new __9_7_Person(60, 95),
new __9_7_Person(68, 110),
};

但是当调用 Arrays.sort(p) 的时候抛出了异常:Exception in thread "main" java.lang.ClassCastException: ch_9$__9_7_Person cannot be cast to java.lang.Comparable
...全文
275 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
3楼说得对。你把comparator和Comparable搅浑了。
wallen56 2012-07-09
  • 打赏
  • 举报
回复
_9_7_Person这个只是一个comparator比较器,而Arrays.sort 是对 comparable 类进行排序的。
你把概念搞混淆了,应该实现 comparable 接口,重写 compareTo()方法
zwnylsf 2012-07-09
  • 打赏
  • 举报
回复
关于Arrays.sort(Object[])其实可以按照指定的排序规则进行排序,默认情况下按照自然顺序(即对象实现了compareble接口,Arrays回调compareble的compare方法进行排序),但是Arrays也支持用户指定比较规则进行排序,就是sort(T[] a, Comparator<? super T> c)这个静态方法(详见API)
修改了了下楼主的代码如下:

package sortutil.test;
import java.util.Arrays;
import java.util.Comparator;
public class __9_7_Person implements Comparator<__9_7_Person> {
private int height;
private int weight;
public __9_7_Person(int height, int weight) {
this.height = height;
this.weight = weight;
}
public int compare(__9_7_Person p1, __9_7_Person p2) {
if (p1.height != p2.height) {
return p1.height - p2.height;
}
else {
return p1.weight - p2.weight;
}
}
public String toString(){
return "\nHeigth:"+height +"||"+"Weight:"+weight;
}
public static void main(String[] args) {
__9_7_Person[] p = {new __9_7_Person(60, 100),
new __9_7_Person(70, 150),
new __9_7_Person(56, 90),
new __9_7_Person(75, 190),
new __9_7_Person(60, 95),
new __9_7_Person(68, 110),
};
Arrays.sort(p,new __9_7_Person(0,0));//new __9_7_Person(0,0)被转成comparator
System.out.println(Arrays.toString(p));
}
}

楼主注意Java命名规则,虽无强制,但遵循好处多多
WayneXuan 2012-07-09
  • 打赏
  • 举报
回复
接口comparator是比较器,Comparable才能实现自然比较
另外类名最好不要以下划线开头
brightyq 2012-07-09
  • 打赏
  • 举报
回复
是继承Comparable接口
并重写compareTo方法
sdojqy1122 2012-07-09
  • 打赏
  • 举报
回复
这是必须的, __9_7_Person这个只是一个comparator比较器,而Arrays.sort 是对 comparable 类进行排序的。
你把概念搞混淆了,应该实现 comparable 接口,重写 compareTo()方法
sdojqy1122 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

可是以前写了一个实现Comparator<String>的 后来也用了 Arrays.sort 对一个 String[] 排序

引用 1 楼 的回复:

这是必须的, __9_7_Person这个只是一个comparator比较器,而Arrays.sort 是对 comparable 类进行排序的。
你把概念搞混淆了,应该实现 comparable 接口,重写 compareTo(……
[/Quote]
String 已经实现了comparable 接口。。。
surongr 2012-07-09
  • 打赏
  • 举报
回复
可是以前写了一个实现Comparator<String>的 后来也用了 Arrays.sort 对一个 String[] 排序

[Quote=引用 1 楼 的回复:]

这是必须的, __9_7_Person这个只是一个comparator比较器,而Arrays.sort 是对 comparable 类进行排序的。
你把概念搞混淆了,应该实现 comparable 接口,重写 compareTo()方法
[/Quote]

62,621

社区成员

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

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