Comparator и equals ()

Предположим, мне нужен TreeSet с отсортированными элементами с некоторой логикой предметной области. По этой логике не имеет значения порядок некоторых элементов, который не равен, поэтому метод сравнения может возвращать 0, но в этом случае я не смог поместить их в TreeSet .

Итак, вопрос: какие недостатки у меня будут от такого кода:

class Foo implements Comparable<Foo>{}
new TreeSet<Foo>(new Comparator<Foo>(){
    @Override
    public int compare(Foo o1, Foo o2) {
        int res = o1.compareTo(o2);
        if(res == 0 || !o1.equals(o2)){
            return o1.hashCode() - o2.hashCode();
        }
        return res;
    }
});

Обновление :

Хорошо. Если всегда должно быть соответствие между методами equals () , hashcode () и compareTo () , как @SP Было бы лучше или даже хорошо, если бы я удалил интерфейс Comparable и переместил эту логику в Comparator (я могу сделать это без нарушенной инкапсуляции)? Так будет:

class Foo{}
new TreeSet<Foo>(new Comparator<Foo>(){
    @Override
    public int compare(Foo o1, Foo o2) {
        //some logic start
        if(strictliBigger(o1, o2)){ return 1;}
        if(strictliBigger(o2, o1)){ return -1;}
        //some logic end
        if(res == 0 || !o1.equals(o2)){
            return o1.hashCode() - o2.hashCode();
        }
        return res;
    }
});

Обновление 2 :

Будет ли System.identityHashCode (x) лучше, чем hashCode () , если мне не нужна стабильная сортировка ?

11
задан marcospereira 21 January 2016 в 17:24
поделиться