2009-08-19 10 views

Respuesta

23

Una de las clases de Colección. Le permite acceder a los elementos de su colección por clave, o secuencialmente por clave. Tiene mucho más sobrecarga que ArrayList o HashMap. Use HashSet cuando no necesite acceso secuencial, solo busque por clave. Use una ArrayList y use Arrays. ordena si solo quieres los elementos en orden. TreeSet mantiene los elementos en orden en todo momento. Con ArrayList solo ordena cuando lo necesita. Con TreeSets, la clave debe estar incrustada en el objeto que almacena en la colección. A menudo puede tener TreeSet of Strings. Todo lo que puedes hacer entonces es decir si una Cadena dada está en el Conjunto. No te encontrará un objeto asociado como lo hará un Treemap. Con TreeMap, las claves y los objetos con los que están asociados están separados.

TreeSet y su hermano TreeMap extrañamente no tienen nada que ver con la representación de árboles. Internamente utilizan una organización en árbol para proporcionarle un conjunto/mapa ordenado alfabéticamente, pero no tiene control sobre los enlaces entre padres e hijos.

Internamente TreeSet usa árboles rojo-negros. No hay necesidad de preseleccionar los datos para obtener un árbol bien equilibrado. Por otro lado, si los datos están ordenados (ascendentes o descendentes), no va a doler como lo hace con otros tipos de árbol.

Si no proporciona un Comparador para definir el orden que desea, TreeSet requiere una implementación Comparable en la clase de elemento para definir el orden natural.

+4

Caso de uso típico: Tome un texto, suelte todas las palabras de este texto en un TreeSet y el iterador proporciona un índice de palabras ordenadas alfabéticamente (sin duplicados). –

+0

"Use HashSet cuando no necesite acceso secuencial, solo busque por clave." - ¿Quiere decir que no necesita buscar por clave (que es lo que proporciona un mapa)? –

+0

Si necesita un acceso secuencial específico pero no ordena, puede usar LinkedHashSet que conserva el orden de los datos de entrada. También TreeSet ha eliminado el orden de logn mientras PriorityQueue remove order es O (n) –

3

TreeSet:
Pros: ordenado, basado en un algoritmo de árbol rojo/negro, proporciona complejidad O (log (N)) para las operaciones.
Contras: el valor debe ser Comparable o necesita proporcionar Comparador en el constructor. Además, la implementación de HashSet proporciona un mejor rendimiento ya que proporciona ~ O (1) complejidad.

+0

¡Muchas gracias, amigo! – Rifk

+0

Parece extraño "basado en un algoritmo de árbol rojo/negro" como "pro". También parece un poco raro mencionar la complejidad de O (log (N)) como profesional cuando lo más obvio para comparar TreeSet es HashSet, que (como dijiste) tiene una mejor complejidad de tiempo. –

+1

@Laurence: 1) La inserción en una lista es O (N) si incluye la comprobación de exclusividad, por lo que O (log (N)) es un "pro" en relación con eso. 2) un HashSet es solo O (1) si usa una función hash decente y permite que crezca la tabla hash. –

0

Supongo que esta estructura de datos usaría un árbol binario para mantener los datos de modo que sea posible la recuperación de orden ascendente. En ese caso, si trata de mantener el árbol en equilibrio, entonces la operación de eliminación sería un poco costosa.

+1

-1: HashSet usa un árbol rojo-negro. De acuerdo con [esta página] (http://www.eli.sdsu.edu/courses/fall95/cs660/notes/RedBlackTree/RedBlack.html) la complejidad de la eliminación es O (log (N)) –

9

Contras: Una trampa con TreeSet es que implementa la interfaz Set de una manera inesperada. Si un TreeSet contiene el objeto a, entonces el objeto b se considera parte del conjunto si a.compareTo (b) devuelve 0, incluso si a.equals (b) es falso, de modo que si compareTo e igual no se implementa de forma coherente camino, te espera un mal viaje.

Esto es especialmente un problema cuando un método devuelve un conjunto y no se sabe si la implementación es un conjunto de árboles o, por ejemplo, un conjunto de claves.

La lección para aprender aquí es, siempre evite implementar compareTo e iguale inconsistentemente. Si necesita ordenar objetos de una manera que es inconsistente con los iguales, use un Comparador.

+1

tal vez usted quería decir "si a.compareTo (b) devuelve cero"? –

+1

Wow. Comentarios constructivos sobre una publicación de 4 años. Gracias, lo he arreglado. – Buhb

2

TreeSet fragmenta la memoria y tiene gastos generales de memoria adicionales. Puede ver las fuentes y calcular la cantidad de memoria adicional y la cantidad de objetos adicionales que crea. Por supuesto, depende de la naturaleza de los objetos almacenados y también puedes sospechar que soy paranoico con la memoria :), pero es mejor no gastarlo aquí y allá. Tienes GC, tienes fallas en el caché y todas estas cosas son malas.

A menudo puede utilizar PriorityQueue en lugar de TreeSet. Y en su caso de uso típico, es mejor simplemente ordenar la matriz de cadenas.

Cuestiones relacionadas