Categorías
Collections

Implementar comparable para un TreeSet

El primer ejemplo a continuación muestra un error común cuando se agrega un objeto a un conjunto. Porque cada elemento de un conjunto debe ser único, cualquier objeto debe compararse con los objetos del conjunto antes de agregarlo.

1. Error común de interfaz comparable

Primero tome una toma en el siguiente código que crea 3 perros y agregue esos perros a un TreeSet.

import java.util.TreeSet;
 
class Dog {
    int size;
    Dog(int s) {
        size = s;
    }
}
 
public class ImpComparableWrong {
 
    public static void main(String[] args) {
        TreeSet<Integer> i = new TreeSet<Integer>();
        TreeSet<Dog> d = new TreeSet<Dog>();
        d.add(new Dog(1));
        d.add(new Dog(2));
        d.add(new Dog(1));
 
        i.add(1);
        i.add(2);
        i.add(3);
 
        System.out.println(d.size() + &quot; &quot; + i.size());
    }
}

La salida es:

correr:

Exception in thread "main" java.lang.ClassCastException: Dog cannot be cast to java.lang.Comparable
        at java.util.TreeMap.put(TreeMap.java:542)
        at java.util.TreeSet.add(TreeSet.java:238)
        at ImpComparableWrong.main(ImpComparableWrong.java:17)
Java Result: 1
BUILD SUCCESSFUL (total time: 2 seconds)

La razón es que Class Dog necesita implementar Comparable para que un TreeSet (que mantiene sus elementos ordenados) pueda contener objetos Dog. El objeto agregado no se puede comparar con los elementos actualmente en el conjunto, la llamada add (Object) arroja una ClassCastException. Para que un objeto sea comparable, la clase definida por el usuario debe implementar la interfaz Comparable.

  Tabla de resumen de clases de colección

2. Solución para implementar Comparable para un TreeSet

El siguiente es el código corregido (que implementa Comparable):

import java.util.TreeSet;
 
class Dog implements Comparable<Dog> {
 
    int size;
 
    Dog(int s) {
        size = s;
    }
 
    public int compareTo(Dog o) {
        return size - o.size;
    }
}
 
public class ImpComparable {
 
    public static void main(String[] args) {
 
        TreeSet<Dog> d = new TreeSet<Dog>();
        d.add(new Dog(1));
        d.add(new Dog(2));
        d.add(new Dog(1));
 
        TreeSet<Integer> i = new TreeSet<Integer>();
        i.add(1);
        i.add(2);
        i.add(3);
 
        System.out.println(d.size() + &quot; &quot; + i.size());
    }
}

Producción:

run:
2 3
BUILD SUCCESSFUL (total time: 0 seconds)

3. Comparador frente a comparable

Echa un vistazo a la comparación y averigua cuándo usar cuál.

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

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