Список к преобразованию TreeSet производит: “java.lang. ClassCastException: MyClass не может быть брошен к java.lang. Сопоставимый”

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.

11
задан Chuck 24 March 2010 в 01:39
поделиться

3 ответа

Реализует ли 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 )

18
ответ дан 3 December 2019 в 05:33
поделиться

Если вы просто хотите, чтобы набор удалял дубликаты, используйте HashSet , хотя это изменит порядок объектов, возвращаемых Iterator , случайным образом.
Но если вы хотите в некоторой степени сохранить порядок, используйте LinkedHashSet , который, по крайней мере, сохранит порядок вставки списка.

TreeSet подходит только в том случае, если вам нужен Set , отсортированный либо по реализации объекта Comparable , либо с помощью специального Comparator , переданного в Конструктор TreeSet.

1
ответ дан 3 December 2019 в 05:33
поделиться

Если вы не передадите явный Компаратор с TreeSet , он попытается сравнить объекты (предполагая, что они Comparable ). И если они не Comparable , он не может их сравнить, поэтому создается это исключение!
TreeSets являются отсортированными наборами и требуют, чтобы объекты были Comparable или Comparator , чтобы определить, как сортировать объекты в Set .

2
ответ дан 3 December 2019 в 05:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: