Предположим, мне нужно 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;
}
});
Обновление
Ok. Если это всегда будет согласованность между методами equals()
, hashcode()
и compareTo()
, как @S.P.Floyd - seanizer и другие.
Если было бы лучше или даже хорошо, если я удалю интерфейс 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()
, если мне не нужна стабильная сортировка?