Преобразование списка в TreeSet производит: "java.ленг.ClassCastException: MyClass нельзя привести к java.ленг.Сходный"
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 не реализует сопоставимый. Я просто хочу использовать набор для фильтрации уникальных элементов списка, так как мой список содержит ненужные дубликаты.
3 ответов
тут MyClass implements Comparable<MyClass>
или что-то в этом роде?
если нет, то вот почему.
на TreeSet
, вы либо должны сделать элементы Comparable
или Comparator
. В противном случае TreeSet
не может функционировать, так как он не знает, как упорядочить элементы.
помните, что TreeMap implements 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))
, то есть " соответствуетequals
это может показаться много, чтобы переварить сначала, но на самом деле это вполне естественно с как определить общий порядок.
если ваши объекты не могут быть заказаны так или иначе, то TreeSet
не имеет смысла. Вы можете использовать HashSet
вместо этого, которые имеют свои собственные контракты. Вы, вероятно, потребуется @Override hashCode()
и equals(Object)
в зависимости от типа (см.: переопределение equals и hashCode в Java)
если вы не передадите явный Comparator
до TreeSet
, он попытается сравнить объекты (предполагая, что они Comparable
). А если нет ... --2-->, он не может их сравнивать, так это исключение!TreeSets
сортируются наборы и требуют, чтобы любой объект был Comparable
или Comparator
для передачи, чтобы определить, как сортировать объекты в Set
.
если вы просто хотите, чтобы удалить дубликаты, используется HashSet
, хотя это перетасует порядок объектов, возвращаемых Iterator
способами, которые кажутся случайными.
Но если вы хотите сохранить порядок несколько, используйте LinkedHashSet
, это, по крайней мере, сохранит порядок вставки списка.
TreeSet
подходит только если вам нужно Set
сортируется либо по реализации объекта Comparable
или по обычаю Comparator
перешло к TreeSet's
конструктор.