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:
- Al implementar la interfaz Comparable
- 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); } }
[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); } }
[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