List<MyClass> myclassList = (List<MyClass>) rs.get();
TreeSet<MyClass> myclassSet = new TreeSet<MyClass>(myclassList);
Я не понимаю, почему этот код генерирует это:
java.lang.ClassCastException: MyClass cannot be cast to java.lang.Comparable
MyClass не реализует Сопоставимый. Я просто хочу использовать Набор для фильтрации уникальных элементов Списка, так как мой Список содержит дубликаты unncessary.
Реализует ли MyClass Comparable
или что-то подобное?
Если нет, то почему.
Для TreeSet
необходимо либо сделать элементы Comparable
, либо предоставить Comparator
. В противном случае TreeSet
не сможет работать, поскольку он не знает, как упорядочить элементы.
Помните, TreeMap реализует SortedSet
, поэтому он должен знать, как упорядочить
элементы тем или иным образом.
Вам следует ознакомиться с тем, как реализация Comparable
определяет естественный порядок для объектов данного типа.
Интерфейс определяет один метод, compareTo
, который должен возвращать отрицательное целое число, ноль или положительное целое число, если этот объект меньше, равен или больше, чем другой объект, соответственно.
Контракт требует , что:
sgn (x.compareTo (y)) == -sgn (y.compareTo (x))
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))
, т.е. «в соответствии с равно
Поначалу это может показаться многословным, но на самом деле это вполне естественно с {{ 1}} как определяется общий порядок.
Если ваши объекты не могут быть упорядочены тем или иным способом, тогда TreeSet
не будет иметь смысла.Вместо этого вы можете использовать HashSet
, у которого есть свои собственные контракты. Скорее всего, вам потребуется @Override hashCode ()
и equals (Object)
в зависимости от вашего типа (см .: Переопределение equals и hashCode в Java )
Если вы просто хотите, чтобы набор удалял дубликаты, используйте HashSet
, хотя это изменит порядок объектов, возвращаемых Iterator
, случайным образом.
Но если вы хотите в некоторой степени сохранить порядок, используйте LinkedHashSet
, который, по крайней мере, сохранит порядок вставки списка.
TreeSet
подходит только в том случае, если вам нужен Set
, отсортированный либо по реализации объекта Comparable
, либо с помощью специального Comparator
, переданного в Конструктор
TreeSet.
Если вы не передадите явный Компаратор
с TreeSet
, он попытается сравнить объекты (предполагая, что они Comparable
). И если они не Comparable
, он не может их сравнить, поэтому создается это исключение!
TreeSets
являются отсортированными наборами и требуют, чтобы объекты были Comparable
или Comparator
, чтобы определить, как сортировать объекты в Set
.