1

这是我的课:

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) 时出现异常:“线程“主”java.lang.ClassCastException 中的异常:ch_9$__9_7_Person 无法转换为 java.lang.Comparable”

4

3 回答 3

8

您实现了 Comparator,而不是 Comparable。您应该实现 Comparable 而不是 Comparator。

文档中所述

数组中的所有元素都必须实现 Comparable 接口。

如果您希望能够对同一类具有不同的排序顺序,比较器很有用。在这种情况下,无法使用 Comparable

于 2012-07-08T18:43:37.790 回答
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.

于 2012-07-08T18:45:41.060 回答
0

您需要实现java.lang.Comparable接口,而不是java.util.Comparator接口。

于 2012-07-08T18:47:34.777 回答