не удается преобразовать hashset в treeset с помощью коллекции объектов
Я должен преобразовать Hashset в TreeSet, но у меня есть ошибки
// Here, All is ok, Chien is an object.
Set<Chien> animaux = new HashSet<Chien>();
animaux.add(new Chien("non", 10));
animaux.add(new Chien("zoz", 15));
animaux.add(new Chien("non", 10));
// And then i have to convert it to TreeSet
// IntellJ-Idead says me that's ok...
// But i have an error here
TreeSet<Chien> treseet = new TreeSet<Chien>(animaux);
Но когда я пытаюсь скомпилировать:
Exception in thread "main" java.lang.ClassCastException: fr.univtln.arouani277.vertebre.animal.Chien cannot be cast to java.lang.Comparable
at java.util.TreeMap.put(TreeMap.java:559)
at java.util.TreeSet.add(TreeSet.java:255)
at java.util.AbstractCollection.addAll(AbstractCollection.java:322)
at java.util.TreeSet.addAll(TreeSet.java:312)
at java.util.TreeSet.<init>(TreeSet.java:160)
at fr.univtln.arouani277.App.main(App.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:622)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Вот мои файлы Chien
:
public class Chien extends Mammifere implements Ibruit {
public Chien(String pnom, int page) {
super(pnom, page);
}
public void aboyer() {
System.out.println("ouaf");
}
public void crier() {
System.out.println("ouaf");
}
}
Он распространяется Mammifere
:
public abstract class Mammifere extends Animal {
public Mammifere(String pnom, int page) {
super(pnom, page);
}
}
Что расширяет Animal
:
public abstract class Animal extends Vertebre {
public Animal(String nom, int page) {
super(nom, page);
}
public void aboyer() {
}
public String toString() {
System.out.println("Je suis un animal");
return super.toString();
}
}
Что расширяет Vertebre
:
http://pastebin.com/Aa4Rw8sW
2 ответа:
В отличие от
HashSet
, aTreeSet
полагается на порядок, поэтому он может быстро определить, есть ли дубликаты. Когда вы переходите вHashSet
кTreeSet
конструктор , он находит, что вашиChien
объекты не являютсяComparable
.Создает новый набор деревьев, содержащий элементы в указанной коллекции, отсортированных в соответствии с естественным порядком его элементов. Все элементы, вставленные в набор, должны реализовывать сопоставимый интерфейс. Кроме того, все такие элементы должны быть взаимно сопоставимые: e1.compareTo (e2) не должен вызывать ClassCastException для любых элементов e1 и e2 в наборе.
У вас есть 2 варианта:
- Пусть ваш
Chien
класс реализуетComparable<Chien>
для выполнения этого требования.- создайте свой
TreeSet
с вашей пользовательской реализациейComparator
. Затем вызовитеaddAll
, передавая вашHashSet
.Comparator
устанавливает порядок вместо того, чтобы класс былComparable
.
Ошибка говорит вам, что не так:
ClassCastException: fr.унивтлн.аруани277.позвонки.животное.Цзянь не может быть брошен на яву.яз..Сопоставимый
Вы должны сделать свой класс
Chien
реализуетComparable
. Это задокументировано в конструктореTreeSet
(Курсив мой):Создает новый набор деревьев, содержащий элементы в указанной коллекции, отсортированных в соответствии с естественным порядком его элементов. все элементы, вставленные в набор, должны реализовывать сопоставимый интерфейс.Кроме того, все такие элементы должны быть взаимно сопоставимы: e1.compareTo (e2) не должен вызывать ClassCastException для любых элементов e1 и e2 в наборе.
Это ожидается, потому что
TreeSet
упорядочивает свой элемент, поэтому он должен знать, как их сравнивать.Поскольку вы строите сложную иерархию классов, возможно, интерфейс
Comparable
должен быть реализован верхним классомVertebre
. Это в зависимости от того, как вы хотите на самом деле сделать сравнение.