实现比较,但在调用Arrays.sort时出现异常

时间:2012-07-08 18:40:51

标签: java comparator

这是我的班级:

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”

3 个答案:

答案 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());

了解ComparableComparator之间的区别非常重要。 Comparable实现说“我知道如何将自己与适当类型的另一个对象进行比较” - 其中Comparator实现说“我知道如何比较适当类型的两个对象”。

显然,任何类型只能实现Comparable一次(在合理范围内),而可以有任意数量的Comparator实现。使用单独的Comparator更灵活,除非您应该使用“明显”的比较。如果您未指定ComparatorArrays.sort将假定数组中的每个元素都可以与数组的其他元素进行比较,即它们实现Comparable

答案 2 :(得分:0)

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