27

私は1つのクラスを持っています.1つの属性ですでにソートしています. ここで、データを並べ替える別の方法を作成する必要があるという別のことを行う必要があります。2つの方法から選択できるようにするにはどうすればよいですか。私が知っている唯一のコマンドは、データを比較したいクラスからメソッドcompareToを取得するCollections.sortです。

それは可能ですか?

4

3 に答える 3

66

あなたがする必要があるのは、カスタムを実装することですComparator。そして、次を使用します。

Collections.sort(yourList, new CustomComparator<YourClass>());

具体的には、次のように記述できます (これにより、 を実装する Anonymous クラスが作成されComparatorます。)

Collections.sort(yourList, new Comparator<YourClass>(){
    public int compare(YourClass one, YourClass two) {
        // compare using whichever properties of ListType you need
    }
});

必要に応じて、これらをクラスに組み込むことができます。

class YourClass {

    static Comparator<YourClass> getAttribute1Comparator() {
        return new Comparator<YourClass>() {
            // compare using attribute 1
        };
    }

    static Comparator<YourClass> getAttribute2Comparator() {
        return new Comparator<YourClass>() {
            // compare using attribute 2
        };
    }
}

次のように使用できます。

Collections.sort(yourList, YourClass.getAttribute2Comparator());
于 2010-12-13T19:42:19.523 に答える
3

compareTo()クラス内で使用できるメソッドは 1 つだけです。

同じクラスを複数の方法でソートする場合は、Comparator実装を作成します。

于 2010-12-13T19:41:35.793 に答える
3

2 つのメソッドがまったく同じフットプリントを必要とする場合、1 つのクラスを複数の用途で不適切にオーバーロードしている可能性があります。これは、クラス階層を修正することで解決できます。たとえば、「shape」を使用する代わりに、「oval」、「rectangle」でサブクラス化します。など

サブクラス化が意味をなさない場合は、別の比較クラスを作成する必要があります。Java では、比較のために Comparator をよく使用します。IsbnComparator、AuthorComparator など、いくつか作成します (または構成可能なコンパレータを作成します)。

ああ、設定可能なオプションは次のようになります。

BookComparator は Compartor を実装します {
   enum FIELD {著者、ISBN、...};
   setSortOrder(int ランク, FIELD フィールド){...}
 }
于 2010-12-13T19:45:18.897 に答える