2010-03-24 19 views
11
List<MyClass> myclassList = (List<MyClass>) rs.get(); 

TreeSet<MyClass> myclassSet = new TreeSet<MyClass>(myclassList); 

No entiendo por qué este código genera la siguiente:a la conversión TreeSet produce: "java.lang.ClassCastException: MiClase no se puede convertir a java.lang.Comparable"

java.lang.ClassCastException: MyClass cannot be cast to java.lang.Comparable 

MiClase hace no implementar Comparable. Solo quiero usar un conjunto para filtrar los elementos únicos de la lista, ya que mi lista contiene duplicados innecesarios.

Respuesta

18

¿MyClass implements Comparable<MyClass> o algo así?

Si no, entonces ese es el motivo.

Para TreeSet, o bien tiene que hacer que los elementos Comparable, o proporcione un Comparator. De lo contrario, TreeSet no puede funcionar, ya que no sabría cómo ordenar los elementos.

Recuerde, TreeMap implements SortedSet, por lo que tiene que saber cómo ordenar los elementos de una manera u otra.

Debe familiarizarse con la forma en la implementación de Comparable define ordenamiento natural de los objetos de un tipo determinado.

La interfaz define un método, compareTo, que debe devolver un entero negativo, cero o un entero positivo si este objeto es menor, igual o mayor que el otro objeto, respectivamente.

El contrato requiere que:

  • sgn(x.compareTo(y)) == -sgn(y.compareTo(x))
  • es transitiva: x.compareTo(y)>0 && y.compareTo(z)>0 implica x.compareTo(z)>0
  • x.compareTo(y)==0 implica que sgn(x.compareTo(z)) == sgn(y.compareTo(z)) para todos z

Además, recomienda que:

  • (x.compareTo(y)==0) == (x.equals(y)), es decir, "en consonancia con equals

Esto puede parecer mucho para digerir al principio, pero en realidad es bastante natural con cómo se defina orden total.


Si los objetos no pueden ser ordenadas de una manera u otra, a continuación, un TreeSet podría no tener sentido. Es posible que desee utilizar un HashSet, que tiene sus propios contratos. Es probable que se requiera a @Override hashCode() y equals(Object) de acuerdo con su tipo (véase: Overriding equals and hashCode in Java)

+0

MyClass no implementa Comparable. Solo quiero usar un conjunto para filtrar los elementos únicos de la lista, ya que mi lista contiene duplicados innecesarios. – Chuck

+2

Use un HashSet y luego. No trata de ordenar los elementos. –

2

Si no pasa un Comparator explícito a TreeSet, intentará comparar los objetos (suponiendo que son Comparable). Y si no son Comparable, no puede compararlos, ¡entonces se lanza esta excepción!
TreeSets se ordenan conjuntos y requieren que cualquiera de los objetos sea Comparable o Comparator para pasarlos a fin de determinar cómo ordenar los objetos en el Set.

1

Si lo que desea es el conjunto para eliminar duplicados, no se le HashSet, a pesar de que va a cambiar el orden de los objetos devueltos por la Iterator en formas que parecen aleatorias.
Pero si desea conservar el orden de alguna manera, use LinkedHashSet, que al menos conservará el orden de inserción de la lista.

TreeSet sólo es adecuado si se necesita el Set ordenados, ya sea mediante la implementación del objeto de Comparable o por una costumbre Comparator pasado al constructor TreeSet's.

Cuestiones relacionadas