TreeSet admite dos métodos de clasificación: clasificación natural y clasificación personalizada. TreeSet utiliza la clasificación natural de forma predeterminada.
1. Clasificación natural
TreeSet llamará al método Compareto (Obj OBJ) del elemento de recolección para comparar la relación de tamaño entre los elementos, y luego organizar los elementos de recolección en orden ascendente. (Presponse para comparación: los dos objetos tienen el mismo tipo).
Java proporciona una interfaz comparable, que define un método de comparación (objeco obj), que devuelve un valor entero. Cuando un objeto llama al método para comparar con otro objeto, por ejemplo OBJ1.comPARTO (OBJ2), si el método devuelve 0, significa que los dos objetos son iguales; obj2;
Las clases comunes de Java implementan una interfaz comparable y proporcionan estándares para tamaños comparativos. Clases comunes que implementan una interfaz comparable:
Si intenta agregar un objeto a un conjunto de árboles, la clase del objeto debe implementar la interfaz comparable.
Se informará un error en el siguiente programa:
Class Err {} public class testtreeSeterror {public static void main (string [] args) {treeSet ts = new TreeSet (); agregar (nuevo err ());ilustrar:
El programa anterior intenta agregar 2 objetos ERR a la colección TreeSet. del método del objeto) se compara con otros elementos en la colección: si la clase correspondiente no implementa la interfaz comparable, se planteará una ClassCastException. Además, al intentar eliminar el primer elemento del elemento del TreeSet, aún se planteará una excepción de ClassCastException.
Al comparar los objetos utilizando el método Compareto (Obj OBJ), el tipo de objeto comparado OBJ debe ser lanzado al mismo tipo, porque solo dos instancias de la misma clase pueden comparar el tamaño. Es decir, el objeto agregado al TreeSet debe ser de la misma clase, de lo contrario se planteará una ClassCastException. Por ejemplo, al agregar un objeto de cadena a un conjunto de árboles, esta operación es completamente normal. Al agregar el objeto de la segunda fecha, Treeset llamará al método Compareto (Obj Obj) del objeto para comparar con otros elementos en la colección, y el programa lanzará una excepción en este momento.
En la programación real, los programadores pueden definir sus propias clases para agregar múltiples tipos de objetos a TreeSet, siempre que la clase definida por el usuario implementa la interfaz comparable. . Convertir. Sin embargo, al operar los datos de recopilación en Treeset, las excepciones de ClassCastExceptio aún se producirán para elementos de diferentes tipos. (Comprenderá después de leer con cuidado)
Cuando se agrega un objeto a la colección TreeSet, TreeSet llama al método Compareto (Obj OBJ) del objeto para comparar el tamaño con otros objetos en el contenedor, y luego determina su ubicación de almacenamiento en función del algoritmo de árbol rojo y negro. Si dos objetos se comparan por igual por comparación (objero obj), TreeSet les considera almacenar la misma ubicación.
Para las colecciones de TreeSet, el criterio para determinar que dos objetos no son iguales es: dos objetos devuelven falsos a través de la comparación de métodos iguales, o comparación (obj obj) la comparación no regresa 0, incluso si los dos objetos son el mismo objeto, TreeSet ellos También se procesará como dos objetos.
El siguiente programa muestra:
// La clase z, reescribió el método igual, siempre devuelve falso, // el método de comparación (Obj OBJ), siempre devuelve la clase de Integer positivo Z comparable {int Age; } public boolean iguales (objeto obj) {return false; Z z1 = nueva z (6); set); Ver también se convierte en 9 System.out.println (((z) (set.last ())). Age);Programa de ejecución de resultados:
verdadero
[TreeSet.z@1fb8ee3, treeset.z@1fb8ee3]
9
ilustrar:
El mismo objeto se agrega dos veces en el programa, porque el método igual () del objeto Z1 siempre devuelve falso, y el método Compareto (Obj OBJ) siempre devuelve 1. De esta manera, Treeset pensará que el objeto Z1 es diferente de sí mismo, así que agregue dos objetos Z1 al TreeSet. Los dos elementos guardados por el objeto TreeSet son en realidad el mismo elemento. Por lo tanto, después de modificar el atributo de edad del primer elemento en la colección de árboles de árboles, el atributo de edad del último elemento en la colección de árboles de árboles también cambia.
Resumen : cuando necesita colocar un objeto en TreeSet y reescribir el método igual () de la clase correspondiente del objeto, debe asegurarse de que el método tenga resultados consistentes con el método Compareto (Obj OBJ). Dos objetos pasan cuando la comparación del método igual de regreso verdadero, los dos objetos deben devolver 0 comparando el método Compareto (Obj OBJ).
Si el método igual comparan dos objetos, pero los dos objetos se comparan mediante el método Compareto (Obj OBJ) y no devuelven 0, esto hará que TreeSet guarde los dos objetos en diferentes ubicaciones, de modo que ambos objetos lo son. Se agregará con éxito, lo cual es un poco diferente de las reglas de las colecciones establecidas.
Si dos objetos regresan 0 comparando el método Compareto (Obj OBJ), pero devuelven falso comparando el método igual: Debido a que los dos objetos se comparan igualmente con la comparación del método Compareto (Obj OBJ), TreeSet intentará salvarlos en el La misma ubicación, pero en realidad no funciona (de lo contrario solo quedará un objeto), por lo que es más problemático de manejar.
Si se agrega un objeto mutable a un conjunto de árboles y el programa posterior modifica las propiedades del objeto mutable, lo que hace que cambie el orden de tamaño con otros objetos, pero el conjunto de árboles no ajustará su orden nuevamente, e incluso puede hacer que se guarde En el TreeSet estos dos objetos, devuelven verdadero al comparar el método igual, y el método Compareto (Obj OBJ) devuelve 0.
El siguiente programa muestra:
clase R {int count; if (obj instancia de r) {r r = (r) obj; clase testHashSet2 {public static void main (string [] args) {hashset hs = new Hashset (); R (9)); .Iterator (); en ninguno de los estados secuenciales.out.println (hs); -3 r objeto? 5));Programa de ejecución de resultados:
[R (atributo de conteo: -3), r (atributo de recuento: -2), r (atributo de conteo: 5), r (atributo de conteo: 9)]
[R (atributo de conteo: 20), r (atributo de recuento: -2), r (atributo de conteo: 5), r (atributo de recuento: -2)]
[R (atributo de conteo: 20), r (atributo de recuento: -2), r (atributo de conteo: 5), r (atributo de recuento: -2)]
[R (atributo de conteo: 20), r (atributo de conteo: -2), r (atributo de recuento: -2)]
ilustrar:
El objeto R en el programa anterior es una reescritura normal del método igual y la clase de métodos comparables. Puede ver que la primera salida del programa se organiza de manera ordenada. Cuando se cambia la propiedad de recuento del objeto R, el resultado de salida del programa también cambia y contiene elementos duplicados. Una vez que se cambian las propiedades de los elementos variables en la colección de árboles de árboles, cuando el objeto se elimina en la vista, TreeSet no se eliminará (incluso los elementos originales en la colección no se han modificado, pero los elementos que son igual al modificado los elementos no se pueden eliminar).
Cuando un objeto R con -2, no se eliminan los elementos;
Resumen: con Hashset, será muy complejo y propenso a errores cuando se trata de estos objetos. Para hacer que el programa sea más robusto, se recomienda que solo se coloquen objetos inmutables en las colecciones hashset y de árboles.
2. Clasificación personalizada
El tipo de árbol natural de árbol se basa en el tamaño de los elementos de la recolección, y el conjunto de árboles los organiza en orden ascendente. Si necesita implementar una clasificación personalizada, como el orden descendente, puede usar la interfaz de comparación. Esta interfaz contiene un método int (T O1, T O2), que se utiliza para comparar los tamaños de O1 y O2.
Si necesita implementar la clasificación personalizada, debe proporcionar un objeto comparador al crear un objeto de recolección de árboles de árboles y proporcionar un objeto comparador para asociar con la colección TreeSet, y el objeto comparador es responsable de la lógica de clasificación de los elementos de recolección.
El siguiente programa muestra:
Clase M {int Age; Main (String [] args) {TreeSet ts = new TreeSet (new Comparator () {public int Compare (Object O1, Object O2) {M M1 = (M) O1; M M2 = (M) O2; if (M1. Age> M2.AGE) {return -1; ts.Add (nuevo M (-3));Programa de ejecución de resultados:
[M Objeto (Edad: 9), M Objeto (Edad: 5), M Objeto (Edad: -3)]
ilustrar:
El programa anterior crea un objeto de clase interna anónima de la interfaz de comparación, que es responsable de la clasificación de la colección TS. Entonces, cuando agregamos objetos M a la colección TS, no es necesario que la clase M implemente la interfaz comparable, porque en este momento, TreeSet no necesita comparar el tamaño a través de los objetos M, sino el objeto comparador asociado con TreeSet es responsable de la clasificación de los elementos de recolección. Al usar la clasificación personalizada, TreeSet clasifica los elementos de recolección independientemente del tamaño del elemento de recolección en sí, pero el objeto comparador es responsable de las reglas de clasificación de los elementos de recolección.