【发布时间】:2011-09-21 10:14:47
【问题描述】:
我已经实现了 compareTo 以允许我根据一些标准比较我的班级'并且它工作正常。
但是,在某些时候,我想在某件事上比较类,而在代码中的另一点,我想根据另一件事比较该类。
是否可以有两个不同的 compareTo 实现,并在某个时候使用一个,在另一个时候使用一个?
【问题讨论】:
我已经实现了 compareTo 以允许我根据一些标准比较我的班级'并且它工作正常。
但是,在某些时候,我想在某件事上比较类,而在代码中的另一点,我想根据另一件事比较该类。
是否可以有两个不同的 compareTo 实现,并在某个时候使用一个,在另一个时候使用一个?
【问题讨论】:
一般来说,实现这一点的机制是实现一个或多个Comparators,并根据需要使用适当的。
【讨论】:
由于您的类是“可比较的”,您可以使用 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);
【讨论】: