这是我的班级:
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)时遇到异常:“线程中的异常”main“java.lang.ClassCastException:ch_9 $ __ 9_7_Person无法强制转换为java.lang.Comparable”
答案 0 :(得分:8)
您实施了Comparator,而不是Comparable。你应该实现Comparable而不是Comparator。
如上所述in the docs:
数组中的所有元素都必须实现Comparable接口。
如果您希望能够为同一个类具有不同的排序顺序,则比较器非常有用。在这种情况下,不能使用Comparable
答案 1 :(得分:4)
您应该为自然排序实施Comparable
,在这种情况下,您无需将分隔符比较器传递到Arrays.sort
。 或您可以实施Comparator<__9_7_Person>
(可能在单独的课程中,例如HeightWeightPersonComparator
)并致电:
Arrays.sort(p, new HeightWeightPersonComparator());
了解Comparable
和Comparator
之间的区别非常重要。 Comparable
实现说“我知道如何将自己与适当类型的另一个对象进行比较” - 其中Comparator
实现说“我知道如何比较适当类型的两个对象”。
显然,任何类型只能实现Comparable
一次(在合理范围内),而可以有任意数量的Comparator
实现。使用单独的Comparator
更灵活,除非您应该使用“明显”的比较。如果您未指定Comparator
,Arrays.sort
将假定数组中的每个元素都可以与数组的其他元素进行比较,即它们实现Comparable
。
答案 2 :(得分:0)
您需要实现java.lang.Comparable
接口,而不是java.util.Comparator
接口。