2015-10-13 4 views
2

je dois convertir HashSet à TreeSet, mais j'ai des erreursne peut pas convertir HashSet à TreeSet avec collection d'objets

// 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); 

Mais quand je tente de compiler:

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) 

Voici mes fichiers 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"); 
    } 
} 

il étend Mammifere:

public abstract class Mammifere extends Animal { 
    public Mammifere(String pnom, int page) { 
     super(pnom, page); 
    } 
} 

qui s'étend 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(); 
    } 
} 

qui s'étend Vertebre: http://pastebin.com/Aa4Rw8sW

Répondre

6

Contrairement à un HashSet, un TreeSet repose sur une commande afin de pouvoir déterminer rapidement s'il existe des doublons. Lorsque vous transmettez le HashSet au TreeSet constructor, il constate que vos objets Chien ne sont pas Comparable.

Construit un nouvel ensemble d'arborescences contenant les éléments de la collection spécifiée, triés en fonction de l'ordre naturel de ses éléments. Tous les éléments insérés dans l'ensemble doivent implémenter l'interface Comparable. De plus, tous ces éléments doivent être mutuellement comparables: e1.compareTo (e2) ne doit pas lancer une exception ClassCastException pour les éléments e1 et e2 de l'ensemble.

Vous avez 2 options:

  • Demandez à mettre en œuvre votre classe ChienComparable<Chien> pour satisfaire à cette exigence. Créez votre TreeSet with your custom implementation of Comparator. Puis appelez addAll, en passant votre HashSet. Le Comparator établit l'ordre au lieu de la classe étant Comparable.
2

L'erreur vous dit ce qui est faux:

ClassCastException: fr.univtln.arouani277. vertebre.animal.Chien ne peut pas être casté en java.lang.Comparable

Vous devez faire en sorte que votre classe Chien implémente Comparable. Ceci est documenté dans le constructeur de TreeSet (Souligné par l'auteur):

Trace un nouvel ensemble d'arbre contenant les éléments de la collection spécifiée, triées en fonction de l'ordre naturel de ses éléments. Tous les éléments insérés dans l'ensemble doivent implémenter l'interface Comparable. De plus, tous ces éléments doivent être mutuellement comparables: e1.compareTo (e2) ne doit pas lancer une exception ClassCastException pour les éléments e1 et e2 de l'ensemble.

Ceci est attendu car un TreeSet commande son élément, il doit donc savoir comment les comparer. Comme vous construisez une hiérarchie de classes complexe, l'interface Comparable doit être implémentée par la classe supérieure Vertebre. Cela dépend de la façon dont vous voulez faire la comparaison.