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() + " " + 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.
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() + " " + 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.