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)を呼び出したときに例外が発生しました:「スレッド「main」の例外java.lang.ClassCastException:ch_9 $__9_7_Personをjava.lang.Comparableにキャストできません」

4

3 に答える 3

8

ComparableではなくComparatorを実装しました。Comparatorの代わりにComparableを実装する必要があります。

ドキュメントに記載されているように:

配列内のすべての要素は、Comparableインターフェイスを実装する必要があります。

コンパレータは、同じクラスに対して異なるソート順を使用できるようにする場合に役立ちます。この場合、Comparableは使用できません

于 2012-07-08T18:43:37.790 に答える
4

自然な順序で実装Comparableする必要があります。その場合、セパレータコンパレータをに渡す必要はありません。または、(おそらく別のクラスで)実装して、次のように呼び出すこともできます。Arrays.sortComparator<__9_7_Person>HeightWeightPersonComparator

Arrays.sort(p, new HeightWeightPersonComparator());

との違いを理解することが重要ComparableですComparatorComparable実装は「自分自身を適切なタイプの別のオブジェクトと比較する方法を知っています」と言います-実装Comparatorは「適切なタイプの2つのオブジェクトを比較する方法を知っています」と言います。

明らかに、どのタイプもComparable(理由の範囲内で)一度だけ実装できますが、Comparator実装はいくつでもかまいません。Comparator使用する必要のある「明らかな」比較がない限り、個別に使用する方が柔軟性があります。を指定しない場合ComparatorArrays.sortは、配列内の各要素がそれ自体を配列の他の要素と比較できる、つまり、を実装すると想定しますComparable

于 2012-07-08T18:45:41.060 に答える
0

java.lang.Comparableインターフェイスではなく、インターフェイスを実装する必要がありjava.util.Comparatorます。

于 2012-07-08T18:47:34.777 に答える