我已經實現了compareTo,允許我根據一些條件比較我的班級,它工作正常。java比較不同的選項
但是,在某些時候,我想比較類的一件事和代碼中的另一點,我想根據另一件事比較類。
是否有可能有兩個不同的compareTo實現,並在某個點和另一個點之間使用一個?
我已經實現了compareTo,允許我根據一些條件比較我的班級,它工作正常。java比較不同的選項
但是,在某些時候,我想比較類的一件事和代碼中的另一點,我想根據另一件事比較類。
是否有可能有兩個不同的compareTo實現,並在某個點和另一個點之間使用一個?
通常,執行此操作的機制是實施一個或多個Comparators並根據需要使用適當的一個。
由於您的類是「Comparable」,所以您可以使用compareTo,但是不能 - 但是 - 創建該函數的更多然後一個實現以用於同一個類中的不同點(您有一個函數可以覆蓋,你不能這樣做兩次)。
但是,您可以查看Comparator Interface;並且該接口的實現可以允許您爲對象實現和使用不同的compareTo。
我們實現了類似的東西寫了我們班的一個實用工具比較 - 這樣的事情:
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);