2012-05-25 18 views
86

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

+1

" los elementos se devuelven en ningún orden en particular (a menos que este conjunto es una instancia de alguna clase que proporciona una garantía). " es lo que dice el método del iterador para un conjunto. encontrado [aquí] (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Set.html) – keyser

Respuesta

140

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

Su interfaz secundaria, SortedSet, representa un conjunto ordenado según 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.

+14

Además, debido a [diferente hash de cadenas] (http://permalink.gmane.org/gmane.comp.java.openjdk.core-libs.devel/10361) en Java 8, el orden predeterminado (sin clasificar) en conjuntos y Maps cambiarán Si confía en un pedido no ordenado, su código se comportará de manera diferente en Java 8. – rustyx

50

LinkedHashSet es lo que necesita.

+39

Una 'Lista' no es un' Conjunto' (no garantiza unicidad de la membresía). –

+3

En muchos casos únicos de negocios, la Lista no se puede usar solo para retener el pedido en lugar de Establecer. LinkedHashSet mantiene el orden y las tiendas son únicas. – gubs

8

El conjunto 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. Usted puede envolver su conjunto esta manera:

Set myOrderedSet = new LinkedHashSet(mySet); 
3

Desde el Javadoc para Set.iterator():

Devuelve un iterador sobre los elementos de 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 un IMPLEMENTACIÓN DE Set que tiene una orden garantizada:

Los elementos se ordenan utilizando su orden natural, o por un comparador proporcionado a la creación de conjunto tiempo, dependiendo de qué constructor se use.

3

establecen normalmente no mantiene el orden, como HashSet con el fin de encontrar rápidamente un emelent, pero se puede tratar LinkedHashSet que se mantendrá el orden que se pone en.

0

La propia interfaz conjunto no establece ningún orden particular. Sin embargo, el SortedSet lo hace.

7

Para conservar el orden use List o LinkedHashSet.

+1

Es 'LinkedHashSet', no ...' Map'. –

+0

oops ... Gracias por detectar. – JHS

-1

Sólo SortedSet ha de hacer el pedido de la Set

+0

La pregunta es sobre retener el orden de inserción (que sucede que se ordena). – assylias

+0

¿Qué tal TreeSet? – Danielson

2

Aquí es un breve resumen de las características orden del estándar de Set implementaciones disponibles en Java:

  1. mantener el orden de inserción: LinkedHashSet y CopyOnWriteArraySet (hilo-seguro)
  2. mantener los elementos ordenados dentro del conjunto: TreeSet, EnumSet (específico de enum s) y ConcurrentSkipListSet (thread-safe)
  3. no impide que los elementos en un orden específico: HashSet (el que se trató)

para su caso específico, puede ordenar los elementos primero y luego usar cualquiera de 1 o 2 (muy probablemente LinkedHashSet o TreeSet). O alternativamente y de manera más eficiente, puede simplemente agregar datos sin clasificar a un TreeSet que se encargará de la clasificación de forma automática para usted.

9

Como muchos de los miembros sugirieron usar LinkedHashSet para conservar el orden de la colección. U puede envolver su conjunto utilizando esta implementación.

SortedSet aplicación se puede utilizar para el orden establecido, pero para su utilización con fines LinkedHashSet.

Además de la documentación,

"Esta implementación repuestos a sus clientes desde el pedido no especificado, generalmente caótica proporcionada por HashSet, sin incurrir en el aumento del costo asociado con TreeSet. Puede ser utilizado para producir una copia de un conjunto que tiene el mismo orden que el original, con independencia de la aplicación del conjunto original: "

Fuente: http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html

Cuestiones relacionadas