2010-12-13 4 views
18

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

それは可能ですか?

+0

それは「もの」の代わりに、より明示的な単語を使用することが可能です場合と"道"、次に良い答えを与えることはより簡単になります。それが立っているので、私は丁寧な質問を理解するために苦労したことを丁重に認めなければなりません。 –

答えて

49

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

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

具体的には、あなたが書くことができる:(これは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()); 
3

クラスにはcompareTo()メソッドを1つしか持てません。

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

3

2つのメソッドが全く同じフットプリントを必要とする場合、クラス階層を修正することによって解決される、複数の用途を持つ1つのクラスを不適切にオーバーロードすることがあります。 "シェイプ"を使用する代わりに、 "楕円" "長方形"など

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

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

 
BookComparator implements Compartor { 
    enum FIELD { AUTHOR, ISBN, ... }; 
    setSortOrder(int rank, FIELD field){...} 
} 
関連する問題