2011-12-15 5 views
2

私はこのクラスを持っている:ため、別の方法を通じて収集

public class Paint implements Comparable<Paint>{ 

    private String cod_paint; 
    private String title_paint; 
    private String author; 
    private int year; 

    public Paint(String cod_paint,String title_paint,String author,int year){ 

    this.cod_paint = cod_paint; 
    this.title_paint = title_paint; 
    this.author = author; 
    this.year = year; 
    } 

    /* And follow get method */ 

} 

今、私はいくつかのオブジェクトのペイントを作成し、私はこのコレクションを一度にソートする必要があり後に例ArrayList

のためのコレクションにそれらを挿入しますもう1回yearと、もう一度cod_paintとなる。

は、例えばペイント方法 compareTo

を私は内部実装する必要がこれを行うには:

public int compareTo(Paint p){ 

    return cod_paint.compareTo(p.cod_paint); 
} 

を、このように私はで私のArrayList<Paint>ことができるでしょう順序でメソッドsortを使用しますときcod_paint。しかし今、どのようにして同じメソッドcompareToで(著者によって、年ごとに)注文するために他の方法を実装することができますか?

答えて

2

異なるソート順が必要な場合は、複数のコンパレータ(Comparator<Paint>)を実装して、sort()関数に適切なものを渡す方が簡単です。

これは匿名クラスを使用して、ラインもを行うことができます。

Collections.sort(my_list, new Comparator<Paint>() { 
    public int compare(Paint o1, Paint o2) { ... } 
    boolean equals(Object obj) { ... } 
}); 
10

はなく、独自Comparatorを使用し、Comparableを使用しないでください。今

public enum PaintComparator implements Comparator<Paint>{ 
    BY_NAME{ 
     @Override 
     public int compareTo(Paint left, Paint right){ 
      return left.getAuthor().compareTo(right.getAuthor()); 
     } 
    }, 
    // more similar items here 
} 

次のようにそれを使用します:私はComparator秒の列挙型と一緒に行きたい

List<Paint> myList = // init list here 
Collections.sort(myList, PaintComparator.BY_NAME); 

参照:

+0

(+1)素敵なテクニック! 2つのコンポーネントはかなり共通していますが、私はそれらをこのように組み合わせたことはありません。 – NPE

+0

でも、私のクラスにも同じように追加する必要があります。? – Mazzy

+0

@Mazzy no、カスタムコンパレータを使用しない場合のみ。 –

関連する問題