не удается преобразовать 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 2

2 ответа:

В отличие от HashSet, a TreeSet полагается на порядок, поэтому он может быстро определить, есть ли дубликаты. Когда вы переходите в HashSet к TreeSet конструктор , он находит, что ваши Chien объекты не являются Comparable.

Создает новый набор деревьев, содержащий элементы в указанной коллекции, отсортированных в соответствии с естественным порядком его элементов. Все элементы, вставленные в набор, должны реализовывать сопоставимый интерфейс. Кроме того, все такие элементы должны быть взаимно сопоставимые: e1.compareTo (e2) не должен вызывать ClassCastException для любых элементов e1 и e2 в наборе.

У вас есть 2 варианта:

Ошибка говорит вам, что не так:

ClassCastException: fr.унивтлн.аруани277.позвонки.животное.Цзянь не может быть брошен на яву.яз..Сопоставимый

Вы должны сделать свой класс Chien реализует Comparable. Это задокументировано в конструкторе TreeSet (Курсив мой):

Создает новый набор деревьев, содержащий элементы в указанной коллекции, отсортированных в соответствии с естественным порядком его элементов. все элементы, вставленные в набор, должны реализовывать сопоставимый интерфейс.Кроме того, все такие элементы должны быть взаимно сопоставимы: e1.compareTo (e2) не должен вызывать ClassCastException для любых элементов e1 и e2 в наборе.

Это ожидается, потому что TreeSet упорядочивает свой элемент, поэтому он должен знать, как их сравнивать.

Поскольку вы строите сложную иерархию классов, возможно, интерфейс Comparable должен быть реализован верхним классом Vertebre. Это в зависимости от того, как вы хотите на самом деле сделать сравнение.