Предположим, мне нужен 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 ()
, если мне не нужна стабильная сортировка ?