¿Cómo arreglar java.lang.ClassCastException en TreeSet usando un comparador personalizado en Java?

TreeSet genera este error porque TreeSet se usa para almacenar elementos en orden ordenado y si el elemento especificado no se puede comparar con los elementos actualmente en el conjunto, entonces TreeSet no podrá almacenar elementos en orden ordenado y, por lo tanto, TreeSet arroja clase lanzar excepción.

¿Cómo arreglar este error?

  • Al proporcionar un comparador personalizado en el constructor TreeSet.

En la clase contenedora como Integer, Double, etc., la interfaz Comparator ya está implementada, por lo que no debemos preocuparnos. Pero cada vez que usamos una clase definida por el usuario en TreeSet, tenemos que hacer cualquiera de las formas mencionadas anteriormente.

Enfoque: al proporcionar un comparador personalizado en el constructor TreeSet

  • Cree una clase que implemente Comparator (y, por lo tanto, el método compare() que realiza el trabajo que anteriormente realizaba compareTo()).
  • Cree una instancia de la clase Comparator.
  • Llame al método sort() sobrecargado, dándole tanto la lista como la instancia de la clase que implementa Comparator.

Java

// Java program to fix java.lang.ClassCastException
// in TreeSet using Comparator
  
import java.util.Comparator;
import java.util.TreeSet;
  
class friendsMarks {
    // class field
    String name;
    String nickName;
    int marks;
  
    // parameterised constructor
    public friendsMarks(String name, String nickName,
                        int marks)
    {
        this.name = name;
        this.nickName = nickName;
        this.marks = marks;
    }
  
    // getter for name
    public String getName() { return name; }
  
    // setter for name
    public void setName(String name) { this.name = name; }
  
    // getter for marks
    public int getMarks() { return marks; }
  
    // setter for marks
    public void setMarks(int marks) { this.marks = marks; }
  
    // getter for nickname
    public String getNickName() { return nickName; }
  
    // setter for nickname
    public void setNickName(String nickName)
    {
        this.nickName = nickName;
    }
  
    //@Override toString method
    public String toString()
    {
        return "friendsMarks{"
            + "name='" + name + '\'' + ", nickName='"
            + nickName + '\'' + ", marks=" + marks + '}';
    }
}
  
// for comparing names
class nameCompare implements Comparator<friendsMarks> {
  
    @Override
    public int compare(friendsMarks friend1,
                       friendsMarks friend2)
    {
        return friend1.getName().compareTo(
            friend2.getName());
    }
}
  
// for comparing marks
class marksCompare implements Comparator<friendsMarks> {
  
    @Override
    public int compare(friendsMarks f1, friendsMarks f2)
    {
        if (f1.getMarks() > f2.getMarks()) {
            return 1;
        }
        else {
            return -1;
        }
    }
}
  
// for comparing nick name
class nickNameCompare implements Comparator<friendsMarks> {
  
    @Override
    public int compare(friendsMarks obj1, friendsMarks obj2)
    {
        return obj1.getNickName().compareTo(
            obj2.getNickName());
    }
}
public class Main {
  
    public static void main(String[] args)
    {
  
        // Creating TreeSet
        // and we have to pass Comparator object
        // of marksCompare class
        // in the TreeSet constructor
        // so that we can sort according to the marks
        TreeSet<friendsMarks> treeSet
            = new TreeSet<>(new marksCompare());
  
        // adding elements to TreeSet
        treeSet.add(new friendsMarks("Raushan", "Chamgader", 99));
        treeSet.add(new friendsMarks("Yashdeep", "Dopa", 95));
        treeSet.add(new friendsMarks("Rupesh", "Gian", 92));
        treeSet.add(new friendsMarks("Shivam", "Gorilla", 47));
        treeSet.add(new friendsMarks("Sarthak", "Nagin", 78));
        treeSet.add(new friendsMarks("Sonika", "Chipkali", 67));
        treeSet.add(new friendsMarks("Himanshu", "Lalten", 57));
  
        System.out.println("Sorting on the basis of marks");
  
        // Displaying using loop
        for (friendsMarks tree : treeSet)
            System.out.println(tree);
  
        // Creating TreeSet
        // and we have to pass Comparator object
        // of nameCompare class
        // in the TreeSet constructor
        // so that we can sort according to the name
        TreeSet<friendsMarks> treeSet1
            = new TreeSet<>(new nameCompare());
  
        // adding elements to TreeSet
        treeSet1.add(new friendsMarks("Raushan", "Chamgader", 99));
        treeSet1.add(new friendsMarks("Yashdeep", "Dopa", 95));
        treeSet1.add(new friendsMarks("Rupesh", "Gian", 92));
        treeSet1.add(new friendsMarks("Shivam", "Gorilla", 47));
        treeSet1.add(new friendsMarks("Sarthak", "Nagin", 78));
        treeSet1.add(new friendsMarks("Sonika", "Chipkali", 67));
        treeSet1.add(new friendsMarks("Himanshu", "Lalten", 57));
  
        // Displaying using loop
        System.out.println("\n\nSorting on the basis of name");
  
        for (friendsMarks tree : treeSet1)
            System.out.println(tree);
  
        // Creating TreeSet
        // and we have to pass Comparator object
        // of nickNameCompare class
        // in the TreeSet constructor
        // so that we can sort according to the nickname
        TreeSet<friendsMarks> treeSet2
            = new TreeSet<>(new nickNameCompare());
  
        // adding elements to TreeSet
        treeSet2.add(new friendsMarks("Raushan", "Chamgader", 99));
        treeSet2.add(new friendsMarks("Yashdeep", "Dopa", 95));
        treeSet2.add(new friendsMarks("Rupesh", "Gian", 92));
        treeSet2.add(new friendsMarks("Shivam", "Gorilla", 47));
        treeSet2.add(new friendsMarks("Sarthak", "Nagin", 78));
        treeSet2.add(new friendsMarks("Sonika", "Chipkali", 67));
        treeSet2.add(new friendsMarks("Himanshu", "Lalten", 57));
  
        // Displaying using loop
        System.out.println("\n\nSorting on the basis of nick-name");
  
        for (friendsMarks tree : treeSet2)
            System.out.println(tree);
    }
}
Producción

Sorting on the basis of marks
friendsMarks{name='Shivam', nickName='Gorilla', marks=47}
friendsMarks{name='Himanshu', nickName='Lalten', marks=57}
friendsMarks{name='Sonika', nickName='Chipkali', marks=67}
friendsMarks{name='Sarthak', nickName='Nagin', marks=78}
friendsMarks{name='Rupesh', nickName='Gian', marks=92}
friendsMarks{name='Yashdeep', nickName='Dopa', marks=95}
friendsMarks{name='Raushan', nickName='Chamgader', marks=99}


Sorting on the basis of name
friendsMarks{name='Himanshu', nickName='Lalten', marks=57}
friendsMarks{name='Raushan', nickName='Chamgader', marks=99}
friendsMarks{name='Rupesh', nickName='Gian', marks=92}
friendsMarks{name='Sarthak', nickName='Nagin', marks=78}
friendsMarks{name='Shivam', nickName='Gorilla', marks=47}
friendsMarks{name='Sonika', nickName='Chipkali', marks=67}
friendsMarks{name='Yashdeep', nickName='Dopa', marks=95}


Sorting on the basis of nick-name
friendsMarks{name='Raushan', nickName='Chamgader', marks=99}
friendsMarks{name='Sonika', nickName='Chipkali', marks=67}
friendsMarks{name='Yashdeep', nickName='Dopa', marks=95}
friendsMarks{name='Rupesh', nickName='Gian', marks=92}
friendsMarks{name='Shivam', nickName='Gorilla', marks=47}
friendsMarks{name='Himanshu', nickName='Lalten', marks=57}
friendsMarks{name='Sarthak', nickName='Nagin', marks=78}

Publicación traducida automáticamente

Artículo escrito por le0 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 *