¿Un Java Set retiene el orden? Un método me devuelve un Set y supuestamente los datos están ordenados pero iterando sobre el Set, los datos están desordenados. ¿Hay una mejor manera de manejar esto? ¿Es necesario cambiar el método para devolver algo distinto de un conjunto?
179
Respuestas:
La
Set
interfaz no ofrece ninguna garantía de pedido.Su subinterfaz
SortedSet
representa un conjunto que se ordena según algún criterio. En Java 6, hay dos contenedores estándar que se implementanSortedSet
. SonTreeSet
yConcurrentSkipListSet
.Además de la
SortedSet
interfaz, también está laLinkedHashSet
clase. Recuerda el orden en que se insertaron los elementos en el conjunto y devuelve sus elementos en ese orden.fuente
LinkedHashSet es lo que necesitas.
fuente
List
no es unSet
(no garantiza la unicidad de membresía).Como muchos de los miembros sugirieron usar LinkedHashSet para retener el orden de la colección. U puede envolver su conjunto utilizando esta implementación.
La implementación de SortedSet se puede usar para el orden ordenado, pero para su propósito use LinkedHashSet .
También de los documentos,
"Esta implementación ahorra a sus clientes el pedido no especificado, generalmente caótico, proporcionado por HashSet, sin incurrir en el mayor costo asociado con TreeSet. Se puede utilizar para producir una copia de un conjunto que tenga el mismo orden que el original, independientemente del original. implementación del conjunto: "
Fuente : http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html
fuente
Set es solo una interfaz. Para retener el orden, debe usar una implementación específica de esa interfaz y la subinterfaz SortedSet, por ejemplo TreeSet o LinkedHashSet. Puedes envolver tu Set de esta manera:
fuente
Aquí hay un resumen rápido de las características de orden de las
Set
implementaciones estándar disponibles en Java:Para su caso específico, puede ordenar los elementos primero y luego usar cualquiera de 1 o 2 (muy probablemente
LinkedHashSet
oTreeSet
). O de manera alternativa y más eficiente , simplemente puede agregar datos sin clasificar a unTreeSet
que se encargará de la clasificación automáticamente por usted.fuente
Para retener la orden use
List
o aLinkedHashSet
.fuente
LinkedHashSet
, no ...Map
.LinkedHashSet es una versión ordenada de HashSet que mantiene una lista doblemente vinculada en todos los elementos. Use esta clase en lugar de HashSet cuando le importe el orden de iteración.
fuente
Del javadoc para
Set.iterator()
:Y, como ya dijo shuuchan , a
TreeSet
es una implementaciónSet
que tiene un orden garantizado:fuente
Normalmente, set no mantiene el orden, como HashSet para encontrar rápidamente un emelent, pero puede probar LinkedHashSet, mantendrá el orden que ingresó.
fuente
Hay 2 cosas diferentes.
fuente
La interfaz Set en sí no estipula ningún orden en particular. El SortedSet hace sin embargo.
fuente
No se supone que el iterador devuelto por Set devuelva datos de forma ordenada. Vea esto Dos java.util.Iteradores a la misma colección: ¿tienen que devolver elementos en el mismo orden?
fuente
Solo se
SortedSet
puede ordenar elSet
fuente