sort retainall ordering navigableset ejemplo java set order

retainall - ¿El conjunto de Java mantiene el orden?



treeset java (12)

Aquí hay un resumen rápido de las características de orden de las implementaciones estándar de Set disponibles en Java:

  1. mantener el orden de inserción: LinkedHashSet y CopyOnWriteArraySet (thread-safe)
  2. Mantenga los elementos ordenados dentro del conjunto: TreeSet , EnumSet (específico de enumeraciones) y ConcurrentSkipListSet (seguro para subprocesos)
  3. no mantiene los elementos en un orden específico: HashSet (el que probó)

Para su caso específico, puede ordenar los elementos primero y luego usar cualquiera de 1 o 2 (lo más probable es LinkedHashSet o TreeSet ). O bien, de manera alternativa y más eficiente , puede agregar datos sin clasificar a TreeSet que se encargará automáticamente de la clasificación.

¿Un conjunto de Java mantiene el orden? Un método me está devolviendo un Set y supuestamente los datos están ordenados pero iterando sobre el conjunto, los datos no están ordenados. ¿Hay una mejor manera de gestionar esto? ¿Es necesario cambiar el método para devolver algo que no sea un conjunto?


Como muchos de los miembros sugirieron utilizar LinkedHashSet para mantener el orden de la colección. U puede envolver su conjunto usando esta implementación.

La implementación de SortedSet se puede usar para el orden ordenado pero para su uso con el propósito LinkedHashSet .

También de los documentos,

"Esta implementación ahorra a sus clientes los pedidos no especificados, generalmente caóticos, proporcionados por HashSet, sin incurrir en el mayor costo asociado con TreeSet. Puede usarse para producir una copia de un conjunto que tiene el mismo orden que el original, independientemente del original implementación del set: "

Fuente: LinkedHashSet


Desde el javadoc para Set.iterator() :

Devuelve un iterador sobre los elementos en este conjunto. Los elementos se devuelven sin un orden en particular (a menos que este conjunto sea una instancia de alguna clase que proporcione una garantía).

Y, como ya se ha dicho por shuuchan , un TreeSet es una implementación de Set que tiene un orden garantizado:

Los elementos se ordenan usando su orden natural, o por un Comparador provisto en el tiempo de creación del conjunto, dependiendo de qué constructor se use.



La interfaz Set no estipula ningún orden en particular. SortedSet hace sin embargo.


Normalmente establecido no mantiene el orden, como HashSet para encontrar rápidamente un emelent, pero puedes probar LinkedHashSet, mantendrá el orden que pones.


Para conservar el orden use List o LinkedHashSet .


Set es solo una interfaz. Para mantener 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:

Set myOrderedSet = new LinkedHashSet(mySet);


Solo SortedSet puede hacer el pedido del Set


Un LinkedHashSet es una versión ordenada de HashSet que mantiene una Lista doblemente enlazada en todos los elementos. Utilice esta clase en lugar de HashSet cuando le interese el orden de iteración.



La interfaz Set no proporciona ninguna garantía de pedido.

Su interfaz SortedSet , SortedSet , representa un conjunto que está ordenado de acuerdo con algún criterio. En Java 6, hay dos contenedores estándar que implementan SortedSet . Son TreeSet y ConcurrentSkipListSet .

Además de la interfaz SortedSet , también está la clase LinkedHashSet . Recuerda el orden en que se insertaron los elementos en el conjunto y devuelve sus elementos en ese orden.