Ява сравнить с разными вариантами - PullRequest
2 голосов
/ 21 сентября 2011

Я реализовал CompareTo, чтобы позволить мне сравнивать свой класс «по некоторым критериям, и он работает нормально.

Однако в какой-то момент я хочу сравнить класс» с одной стороны и с другойв коде я хочу сравнить класс на основе другой вещи.

Возможно ли иметь две разные реализации CompareTo и использовать одну в некоторой точке и одну в другой?

Ответы [ 3 ]

5 голосов
/ 21 сентября 2011

В общем случае механизм для этого заключается в реализации одного или нескольких компараторов и использовании соответствующего по мере необходимости.

2 голосов
/ 21 сентября 2011

Поскольку ваш класс "Comparable", вы можете использовать CompareTo, однако вы не можете - однако - создать более одной реализации этой функции для использования в разных точках одного и того же класса (у вас есть одна функция для переопределения, и ты не можешь сделать это дважды).

Однако вы можете взглянуть на интерфейс компаратора ; и реализация этого интерфейса может позволить вам реализовать и использовать другое сравнение для вашего объекта.

0 голосов
/ 21 сентября 2011

Мы достигли чего-то похожего, написав утилиту сравнения для нашего класса - что-то вроде этого:

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);
...