¿Cómo arreglar java.lang.ClassCastException en TreeSet?

La clase TreeSet en Java implementa la interfaz Set que usa un árbol para almacenar elementos que contienen objetos únicos almacenados en orden ascendente. Puede encontrarse con una excepción llamada java.lang.ClassCastException mientras trabaja con objetos TreeSet. Básicamente, los elementos de TreeSet se ordenan de forma natural o mediante el Comparator definido en el constructor. Si ninguno de los dos sucede, es decir, no se produce el orden natural y tampoco proporcionó ningún comparador, entonces java lanza una excepción que es java.lang.ClassCastException .

Ejemplo

Java

// Java program to demonstrate ClassCastException by TreeSet
  
import java.util.TreeSet;
  
// class which is going to assign
// student marks
class Student {
  
    int marks;
  
    // constructor
    public Student(int marks) { this.marks = marks; }
  
    // override toString() method
    // for display purpose
    public String toString()
    {
        return "Student marks = " + this.marks;
    }
}
  
// Driver class
class GFG {
    public static void main(String[] args)
    {
  
        // Declaring Tree Set
        TreeSet<Student> treeSet = new TreeSet<Student>();
  
        // this line will throw java.lang.ClassCastException
        treeSet.add(new Student(1));
  
        // Displaying the contents of in treeSet
        System.out.println(treeSet);
    }
}

Producción

Excepción en el subproceso «principal» java.lang.ClassCastException: la clase Student no se puede convertir a la clase java.lang.Comparable (Student está en el módulo sin nombre del cargador ‘app’; java.lang.Comparable está en el módulo java.base del cargador ‘ oreja’)

en java.base/java.util.TreeMap.compare(TreeMap.java:1291)

en java.base/java.util.TreeMap.put(TreeMap.java:536)

en java.base/java.util.TreeSet.add(TreeSet.java:255)

en GFG.main(Archivo.java:31)

Podemos resolver esta excepción de dos formas:

  1. Al implementar la interfaz Comparable
  2. Al definir la clase Comparator personalizada

Enfoque 1 (Implementación de una interfaz comparable)

La interfaz comparable de Java se implementa mediante una clase que se utiliza para comparar y ordenar los objetos de acuerdo con el orden natural. El ordenamiento natural es posible usando la función compareTo(). Los objetos de string y los objetos de clase contenedora se ordenan de acuerdo con la función integrada compareTo() .

Si la función compareTo devuelve positivo, negativo o cero, entonces el objeto actual es mayor, menor e igual al objeto proporcionado, respectivamente.

Ejemplo 1:  

Java

// Java program to sort student data
// according to marks
// using Comparable interface
  
import java.util.TreeSet;
  
// class which is going to assign
// student marks
class Student implements Comparable<Student> {
  
    int id;
    String name;
    int marks;
  
    // constructor
    public Student(int id, String name, int marks)
    {
  
        // assigning values
        this.id = id;
        this.name = name;
        this.marks = marks;
    }
  
    // compareTo method to sort in
    // ascending order
    public int compareTo(Student obj)
    {
        return this.marks - obj.marks;
    }
  
    // override toString() method
    // for display purpose
    public String toString()
    {
        return "Id: " + this.id + " Name: " + this.name
            + " Marks: " + this.marks;
    }
}
  
// Driver class
class GFG {
    public static void main(String[] args)
    {
  
        // Declaring Tree Set
        TreeSet<Student> treeSet = new TreeSet<Student>();
  
        treeSet.add(new Student(1, "Suresh", 87));
        treeSet.add(new Student(2, "Ramesh", 78));
        treeSet.add(new Student(3, "Lokesh", 95));
  
        // Displaying the contents of in treeSet
        System.out.println(treeSet);
    }
}
Producción

[Id: 2 Name: Ramesh Marks: 78, Id: 1 Name: Suresh Marks: 87, Id: 3 Name: Lokesh Marks: 95]

 Enfoque 2 (usando la clase de comparador personalizado)

Un comparador es una interfaz que tiene que implementar la clase mediante la cual podemos ordenar los objetos de la clase definida por el usuario. Tiene 2 métodos principales que se usan ampliamente, compare (T o1, T o2) y equals (Object obj) que devuelve un int y un valor booleano respectivamente. Implementemos el mismo ejemplo usando un comparador.

Java

// Java program to sort student data
// according to marks using custom class
// which implements Comparator
  
// comparator interface present in
// java.util package
import java.util.*;
// class which is going to assign
// student marks
class Student {
  
    int id;
    String name;
    int marks;
  
    // constructor
    public Student(int id, String name, int marks)
    {
  
        // assigning values
        this.id = id;
        this.name = name;
        this.marks = marks;
    }
  
    // method to return
    // current marks of student
    public int getMarks() { return this.marks; }
  
    // override toString() method
    // for display purpose
    public String toString()
    {
        return "Id: " + this.id + " Name: " + this.name
            + " Marks: " + this.marks;
    }
}
  
// StuComparator class will compare
// objects ans sorts in
// ascending order
class StuComparator implements Comparator<Student> {
  
    // defining compare method
    public int compare(Student obj1, Student obj2)
    {
        return obj1.getMarks() - obj2.getMarks();
    }
}
  
// Driver class
class GFG {
    public static void main(String[] args)
    {
  
        // Declaring Tree Set
        TreeSet<Student> treeSet
            = new TreeSet<Student>(new StuComparator());
  
        treeSet.add(new Student(1, "Suresh", 87));
        treeSet.add(new Student(2, "Ramesh", 78));
        treeSet.add(new Student(3, "Lokesh", 95));
  
        // Displaying the contents of in treeSet
        System.out.println(treeSet);
    }
}
Producción

[Id: 2 Name: Ramesh Marks: 78, Id: 1 Name: Suresh Marks: 87, Id: 3 Name: Lokesh Marks: 95]

Publicación traducida automáticamente

Artículo escrito por dadimadhav y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *