8
@Override
public int compareTo(Object t) 
{
    if(t instanceof Student)
    {
        Student s = (Student)t;
        return (this.name.compareTo(s.name));
    }
    else
        return -1;
}

これは、名前に基づいてcompareTo2 つのオブジェクトを比較するためのメソッドの実装です。Student複数のフィールド、つまり名前と年齢の両方に基づいて、そのような 2 つのオブジェクトを比較することは可能ですか?

4

4 に答える 4

16

はい。ただし、最初に、実装する Comparable インターフェイスを入力する必要があります。これは次のようになります。

public class Student implements Comparable<Student> {
    private int age;
    private String name;
    @Override
    public int compareTo(Student s) {
        if (name.equals(s.name))
            return age - s.age;
        return name.compareTo(s.name));
    }
}

Comparable<Student>生の type の代わりにtyped interface を使用するとComparable、キャストする必要がないことに注意してください。

于 2013-09-12T07:43:36.367 に答える
3

Comparatorはい、インターフェイスcompareメソッドを使用して、異なる並べ替え順序に基づいて 2 つのオブジェクトを比較できます。

ソート シーケンス クラスを作成する必要があります。コンパレーターを使用したユーザー定義オブジェクトのソート

于 2013-09-12T07:16:48.107 に答える
1

上記のコードでメソッドをオーバーライドしているのではなく、メソッドをオーバーロードしていることに注意してください。compareTo

あなたinterfaceが実装している:

public interface Comparable<T> {
    public int compareTo(T o);
}

あなたの実装:

@Override
public int compareTo(Object t) {
    //...
}

このインターフェースの最初の作成者である Josh Bloch は、彼の著書『Effective Java@Override 』の中で、まさにこの理由でアノテーションを使用するようアドバイスしています。過負荷によって引き起こされるバグは、見つけるのがかなり難しい場合があります。

これらのオブジェクトを「複数のフィールドに基づいて」比較したいとおっしゃいましたが、これが「2 つのフィールドに基づいて 1 つの方法で並べ替える」ことを意味するのか、それとも「1 つのフィールドに基づいて複数の方法で並べ替える」ことを意味するのかはわかりません。ここの他の回答で示されているように、どちらも可能です。

ただし、これが結論です。

Comparable<T>自分でクラスを作成しているように見え、このクラスの「自然な順序付け」を定義したい場合は、実装する必要があります。複数の順序付けを定義したい場合、または問題のクラスを制御できない場合は、実装するクラスで独自の順序付けを定義してくださいComparator<T>(こちらを参照)。

于 2014-12-27T05:33:58.820 に答える