¿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?
Respuesta
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.
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
LinkedHashSet es lo que necesita.
Una 'Lista' no es un' Conjunto' (no garantiza unicidad de la membresía). –
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
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);
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.
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.
La propia interfaz conjunto no establece ningún orden particular. Sin embargo, el SortedSet lo hace.
Para conservar el orden use List
o LinkedHashSet
.
Es 'LinkedHashSet', no ...' Map'. –
oops ... Gracias por detectar. – JHS
El iterador devuelto por Set no debe devolver los datos en el modo ordenado. ver este Two java.util.Iterators to the same collection: do they have to return elements in the same order?
Aquí es un breve resumen de las características orden del estándar de Set
implementaciones disponibles en Java:
- mantener el orden de inserción: LinkedHashSet y CopyOnWriteArraySet (hilo-seguro)
- mantener los elementos ordenados dentro del conjunto: TreeSet, EnumSet (específico de enum s) y ConcurrentSkipListSet (thread-safe)
- 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.
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
- 1. orden de retención durante el uso de diferencia de conjuntos de Python
- 2. Cómo establecer el orden de los repositorios en Maven settings.xml
- 3. Establecer el campo de orden de clasificación según el orden alfabético de otro campo
- 4. Establecer el orden de inserción de preservación de la colección
- 5. Establecer el orden de los elementos de los cambios?
- 6. Establecer el orden de iteración varía de ejecución a ejecución
- 7. parcelas semilog con retención
- 8. Fungibles de retención como variables
- 9. Cómo establecer el orden de byte sockaddr_in6 :: sin6_addr en orden de bytes de red?
- 10. cómo establecer el orden de tabulación en jquery
- 11. Orden de clasificación en el mapa STL y establecer
- 12. ¿Cómo establecer el orden de jar en WebLogic?
- 13. Cómo establecer el orden Z de un control usando WinForms
- 14. ¿Utilizar la liberación automática al establecer una propiedad de retención usando la sintaxis de punto?
- 15. Java File.list() orden consistente?
- 16. Java Array Orden descendente?
- 17. orden lexicográfico en Java
- 18. ¿Orden sugerida de anotación Java?
- 19. Java JTable establecer el ancho de columna
- 20. ¿Qué aumenta el recuento de retención de un objeto?
- 21. ¿El método de retención de NSObject es atómico?
- 22. Ciclo de ARC, Bloques y retención
- 23. performSelector: withObject: y su comportamiento de retención
- 24. Datos básicos y ciclos de retención
- 25. ¿LinkedHashMap de Java mantiene el orden de las claves?
- 26. ¿El orden de ejecución de los parámetros garantiza en Java?
- 27. Colecciones Java que mantienen el orden de inserción
- 28. Java: ¿LinkedBlockingQueue tiene en cuenta el orden de los consumidores?
- 29. ¿Cómo se establece el orden de tabulación en Swing Java?
- 30. En Java, ¿cuál es el "orden de operaciones" booleano?
" 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