2017-09-09 15 views
0

étudiant de classe J'ai fait un étudiant de classe qui accepte le numéro de rôle, la norme, le prénom et le nom de famille. J'utilise TreeSet pour entrer les valeurs dans l'étudiant. Je reçois une exception de cast de classe sur ce programme lorsqu'il est exécuté. Est-ce parce que j'entre des valeurs heterogeneus que le Treeset ne peut pas trier.Pourquoi TreeSet donne-t-il une exception de classification

public class Student { 

private int rollno; 
private int std; 
private String firstname; 
private String lastname; 


//getters , setters, constructors, toString 

@Override 
public int hashCode(){ 

    return Objects.hash(rollno, std, firstname,lastname); 

} 
} 

StudentTest de classe qui a principal()

public class StudentTreeSet { 

    public static void main(String[]args){ 

    Set<Student> students = new TreeSet<Student>(); 

    Student s1 = new Student(1,2,"Shelly","Bhargav"); 
    Student s2 = new Student(1,2,"Shelly","Bhargav"); 
    Student s3 = new Student(3,2,"Shelly","Bhargav"); 

    students.add(s1); 
    students.add(s2); 
    students.add(s3); 

    students.add(s1); 
    students.add(s2); 
    students.add(s3); 

    System.out.println(); 
    System.out.println(); 
    int studentsize2 = students.size(); 
    System.out.println("Again Students size ="+ studentsize2); 

    for(Student student : students){ 
     System.out.println(student); 
     System.out.println("student hashcode="+student.hashCode()); 
    } 
    } 


    } 

sortie:

Exception in thread "main" java.lang.ClassCastException: com.techlabs.studenthashset.Student cannot be cast to java.lang.Comparable 
at java.util.TreeMap.compare(Unknown Source) 
at java.util.TreeMap.put(Unknown Source) 
at java.util.TreeSet.add(Unknown Source) 
at com.techlabs.TreeSet.StudentTreeSet.main(StudentTreeSet.java:18) 
+2

Montrez-nous qu'il Exception vous obtenez. Je spéculerais que vous l'obtenez parce que votre classe '˙Student' n'implémente pas' Comparable' qui serait nécessaire à 'TreeSet'. (Ou un 'comparateur 'spécifié dans l'instanciation ...) –

Répondre

0

Vous devez implémenter l'interface Comparable<> pour la classe Student. Arbre mis en interne utiliser des comparables ainsi.

public class Student implements Comparable<Student> {  
    private int rollno; 
    private int std; 
    private String firstname; 
    private String lastname; 

    @Override 
    public int compareTo(Student o) { 
     if (this.rollno > o.rollno) { 
      return 1; 
     } else if (this.rollno == o.rollno) { 
      return 0; 
     } else { 
      return -1; 
     } 
    } 
} 
+1

Une meilleure implémentation serait simplement' return Integer.compare (this.rollno, o.rollno); ' – Andreas

+0

@ Aditya pourquoi utilisons-nous Que fait-il –

+0

@ Java_Learner: TreeSet: Une implémentation NavigableSet basée sur un TreeMap. Les éléments sont classés en utilisant leur ordre naturel, ou par un comparateur fourni au moment de la création de l'ensemble, selon le constructeur utilisé. Pour plus de détails se référer à la documentation officielle de [TreeSet] (https://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html) Vous pouvez passer par ci-dessous [tutoriel] (https://www.javatpoint.com/java-treeset) pour obtenir plus de compréhension. L'utilisation de Comparable permet de trier TreeSet API. Ceci est nécessaire pour les objets définis par l'utilisateur. –

0

1.TreeSet est un ensemble trié, si la valeur que vous ajoutez à la TreeSet ne peut pas être comparé à l'autre, TreeSet va jeter ClassCastException.
2. La classe Student n'est pas comparable, comment voulez-vous que TreeSet soit trié pour vous. Peut-être que ce dont vous avez besoin est org.apache.commons.collections.set.ListOrderedSet.

TreeMap.put method

0

Selon le document oracle https://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html

TreeSet publique()

Trace un nouvel ensemble d'arbre vide, triés selon 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. Si l'utilisateur tente d'ajouter un élément à l'ensemble qui viole cette contrainte (par exemple, l'utilisateur tente d'ajouter un élément de chaîne à un ensemble dont les éléments sont des entiers), l'appel add lancera une exception ClassCastException.