2011-09-21 22 views
2

compareToを実装して、いくつかの基準に基づいてクラスを比較できるようにしました。java異なるオプションと比較する

しかし、ある時点で、あるクラスのクラスと他のクラスのクラスを比較したいと思います。別のものに基づいてクラスを比較したいと思います。

compareToを2つの異なる実装にして、ある点と別の点を使用することはできますか?

答えて

5

通常、これを行うメカニズムは、1つまたは複数のComparatorsを実装し、必要に応じて適切なものを使用することです。

2

あなたのクラスは "Comparable"なので、compareToを使うことはできますが、同じクラスの異なるポイントでその関数の複数の実装を使うことはできません。あなたはそれを2回することはできません)。

ただし、Comparator Interfaceをご覧ください。そのインタフェースを実装することで、オブジェクトに対して異なるcompareToを実装して使用することができます。

0

私たちは、私たちのクラスのためのユーティリティコンパレータを書き込むことにより、似たような達成 - このような何か:私たちは、このようにそれを使用することができます

public class FooComparator implements Comparator<Foo> { 

    public static String COMPARE_FIELD1 = "COMPARE_FIELD1"; 
    public static String COMPARE_FIELD2 = "COMPARE_FIELD2"; 
    public static String COMPARE_FIELD3 = "COMPARE_FIELD3"; 
    private String compareBy = COMPARE_FIELD1; 
    private boolean reverse = true; 

    public FooComparator(){} 

    public FooComparator(String sort){ 
     compareBy = sort; 
    } 

    public void reverse() { 
     if(reverse) {reverse = false; 
     } else {reverse = true;} 
    } 

    public void field1Sort() {compareBy = COMPARE_FIELD1;} 
    public void field2Sort() {compareBy = COMPARE_FIELD2;} 
    public void field3Sort() {compareBy = COMPARE_FIELD3;} 

    public int compare(Foo foo1, Foo foo2) { 
     if(compareBy.equals(COMPARE_FIELD2)) { 
      return compareByField2(foo1, foo2); 
     } else if(compareBy.equals(COMPARE_FIELD3)) { 
      return compareByField3(foo1, foo2); 
     } 
     return compareByField1(foo1, foo2); 
    } 

    private int compareByField1(Foo foo1, Foo foo2) {  
     if(reverse) {return foo1.getField1().compareTo(foo2.getField1());} 
     return foo1.getField1().compareTo(foo2.getField1());   
    } 

    private int compareByField2(Foo foo1, Foo foo2) {  
     if(reverse) {return foo1.getField2().compareTo(foo2.getField2());} 
     return foo1.getField2().compareTo(foo2.getField2());   
    } 

    private int compareByField3(Foo foo1, Foo foo2) {  
     if(reverse) {return foo1.getField3().compareTo(foo2.getField3());} 
     return foo1.getField3().compareTo(foo2.getField3());   
    } 
} 

を:

List<Foo> foos = new ArrayList<Foo>(); 
FooComparator comparator = new FooComparator(FooComparator.COMPARE_FIELD1);  
Collections.sort(foos, comparator); 
関連する問題