java比较不同的选项

时间:2011-09-21 10:14:48

标签: java class compare

我已经实现了compareTo,允许我根据某些标准对我的班级进行比较,并且工作正常。

然而,在某些时候,我想比较一个事物和代码中的另一个点上的类,我想根据另一个事情来比较这个类。

是否有可能有两种不同的compareTo实现,并且在某个时刻使用一个,在另一个时使用一个?

3 个答案:

答案 0 :(得分:5)

一般来说,执行此操作的机制是实现一个或多个Comparators并根据需要使用适当的一个。

答案 1 :(得分:2)

由于你的Class是“Comparable”你可以使用compareTo,但是你不能 - 但是 - 创建该函数的多个实现,以便在同一个Class中的不同点使用(你有一个函数要覆盖,并且你不能两次这样做。)

但是,您可以查看Comparator Interface;并且该接口的实现可以允许您为对象实现和使用不同的compareTo。

答案 2 :(得分: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);