Ответ 1
Есть ли MyClass implements Comparable<MyClass>
или что-то в этом роде?
Если нет, то почему.
Для TreeSet
вам нужно либо сделать элементы Comparable
, либо предоставить Comparator
. В противном случае TreeSet
не может функционировать, поскольку он не знает, как упорядочить элементы.
Помните, TreeMap implements SortedSet
, поэтому он должен знать, как заказать
элементы так или иначе.
Вам следует ознакомиться с тем, как реализовать Comparable
определяет естественное упорядочение объектов данного типа.
Интерфейс определяет один метод compareTo
, который должен возвращать отрицательное целое число, ноль или положительное целое число, если этот объект меньше, равен или больше, чем другой объект соответственно.
Контракт требует, чтобы:
-
sgn(x.compareTo(y)) == -sgn(y.compareTo(x))
- it transitive:
x.compareTo(y)>0 && y.compareTo(z)>0
подразумеваетx.compareTo(z)>0
-
x.compareTo(y)==0
означает, чтоsgn(x.compareTo(z)) == sgn(y.compareTo(z))
для всехz
Кроме того, он рекомендует:
-
(x.compareTo(y)==0) == (x.equals(y))
, то есть "согласуется сequals
Это может показаться, что сначала нужно переварить, но на самом деле это вполне естественно с как определить общий порядок.
Если ваши объекты не могут быть упорядочены так или иначе, тогда TreeSet
не имеет смысла. Вместо этого вы можете использовать HashSet
, у которого есть свои собственные контракты. Скорее всего, вам потребуется @Override hashCode()
и equals(Object)
в зависимости от вашего типа (см. Переопределение равных и хэш-код в Java)