2011-09-21 59 views
2

我已經實現了compareTo,允許我根據一些條件比較我的班級,它工作正常。java比較不同的選項

但是,在某些時候,我想比較類的一件事和代碼中的另一點,我想根據另一件事比較類。

是否有可能有兩個不同的compareTo實現,並在某個點和另一個點之間使用一個?

回答

5

通常,執行此操作的機制是實施一個或多個Comparators並根據需要使用適當的一個。

2

由於您的類是「Comparable」,所以您可以使用compareTo,但是不能 - 但是 - 創建該函數的更多然後一個實現以用於同一個類中的不同點(您有一個函數可以覆蓋,你不能這樣做兩次)。

但是,您可以查看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);