2012-03-30 11 views
6

Obviamente, los conjuntos no tienen ningún tipo de pedido, por lo que no se puede esperar ningún orden específico si lo hago¿Es el determinante "toArray" de un conjunto?

String[] string = mySet.toArray(); 

Sin embargo, estoy frente a un caso de uso en el que no importa lo que ordena la matriz de cadenas se encuentra, pero lo hago necesito ser el caso de que si dos conjuntos son iguales entre sí, entonces:

StringUtils.join(mySet.toArray(),','); 

producirá la misma cadena exacta de esos conjuntos, siempre, no importa cuántas veces corro el programa suponiendo que sigo con el mismo código.

¿Tengo esta garantía?

De manera similar, ¿esto es cierto para el orden en que los elementos aparecen para un conjunto determinado en un iterador?

+2

Un aparte: "Java" no es un acrónimo. – bernie

+1

Los conjuntos pueden tener un pedido. Por ejemplo TreeSet. – kukudas

+0

@kukudas Realmente pensé que "no ordenar" era uno de los requisitos de facto de un conjunto. ¡Gracias! – Jeremy

Respuesta

4

Técnicamente, no, no tienes garantía. Set es una interfaz. Las implementaciones variarán y pueden o no obedecer este requisito.

Fuerce el problema ordenando el conjunto usted mismo después de extraer los resultados del conjunto.

+0

Gracias. Todas las respuestas excelentes aquí (todas las votaron por encima) pero esta da una solución clara. Voy a "forzar el problema". – Jeremy

7

En general, no puede garantizar el orden de un Set como usted menciona, por lo que incluso si funciona ahora, puede que no en el futuro. Sin embargo, usted puede garantizar el orden de LinkedHashSet por lo que puede usarlo. Esto solo funciona si los conjuntos tenían los elementos insertados en el mismo orden. Si no tienes esa situación, probablemente solo tengas que ordenar el conjunto e imprimirlo.

4

No, absolutamente no. Para un ejemplo trivial, considerar:

LinkedHashSet<String> set1 = new LinkedHashSet<String>(); 
set1.add("x"); 
set1.add("y"); 

LinkedHashSet<String> set2 = new LinkedHashSet<String>(); 
set2.add("y"); 
set2.add("x"); 

Esos dos conjuntos son iguales, sino porque LinkedHashSet preserva el orden de inserción, está garantizado que sus iteradores tendrán valores de retorno en un orden diferente - y yo esperaría toArray tener el mismo efecto.

2

No tiene esta garantía. Puede ser que siempre vea este trabajo, porque sospecho que la mayoría de las implementaciones de Set.toArray() producirán el mismo orden para conjuntos iguales, pero usted no puede confiar en esto en.

Tampoco puede confiar en el pedido de un iterador.

Los conjuntos están completamente desordenados. Es posible que, debido al comportamiento de implementación, obtenga algo que parezca una orden consistente de ellos, pero esto no es de ninguna manera confiable.

3

Eso dependería completamente de la implementación Set. Set es una interfaz, no una clase, y toArray() no garantiza nada excepto que debe coincidir con el iterador de la implementación.

Desde el Javadoc para Set.toArray():

Si este conjunto hace ninguna garantía en cuanto a qué ordenar sus elementos son devueltos por su iterador, este método debe devolver los elementos en el mismo orden.

Cuestiones relacionadas