2011-01-14 11 views
5
import java.util.*; 
public class DuplicateCheckMain { 
public static void main(String[] gopal){ 
    Integer[] args = {6,9,2,55,100,1,6,8,9}; 
    Integer[] args1 = {3,6,2,3,5}; 
    Set S = new HashSet(); 
    DuplicateCheck.checkDuplicate(S,args,new String("HashSet")); 
    Set S1 = new HashSet(); 
    DuplicateCheck.checkDuplicate(S1,args1,new String("HashSet")); 

    S = new TreeSet(); 
    DuplicateCheck.checkDuplicate(S,args,new String("TreeSet")); 

    S = new LinkedHashSet(); 
    DuplicateCheck.checkDuplicate(S,args,new String("LinkedHashSet")); 

} 
} 

public class DuplicateCheck { 

public static void checkDuplicate(Set S, Integer[] args, String setname){ 
    for(int i = 0;i<args.length;i++){ 
    if(!S.add(args[i])){System.out.println("Duplicate element "+args[i]);} 
    } 
    System.out.println(S +" "+ setname); 
} 
} 

Pregunta: para el HashSet con referencia S, el HashSet no está ordenado. Pero para la referencia S1, el HashSet está ordenado. ¿Porque?¿HashSet no garantiza la clasificación?

+0

Utilice las etiquetas de código. ¡Será más legible! –

+0

¿Podría proporcionar la salida? –

+0

de salida: elemento Duplicar 6 elemento Duplicar 9 [1, 100, 2, 55, 6, 8, 9] HashSet elemento Duplicar 3 [2, 3, 5, 6] HashSet elemento Duplicar 6 elemento Duplicar 9 [1, 2, 6, 8, 9, 55, 100] TreeSet Elemento duplicado 6 Elemento duplicado 9 [6, 9, 2, 55, 100, 1, 8] LinkedHashSet – Gopal

Respuesta

5

HashSet es absolutamente no garantizado para ser ordenado. El pedido no está garantizado en absoluto.

De la documentación del método iterator():

Devuelve un iterador sobre los elementos de este conjunto. Los elementos se devuelven sin un orden particular.

HashSet está diseñado para insertar y comprobar la presencia de elementos muy rápidamente, por igualdad. Eso es todo.

Si necesita ordenar, debe usar una implementación de SortedSet, como TreeSet o ConcurrentSkipListSet.

3

HashSet usa un mod para almacenar el número en una entrada de cubo

En el args1 array todo el número es menor de 16 - el tamaño HashSet predeterminado. es por eso que termina siendo ordenado.

+0

si ese es el caso, entonces ¿por qué no funciona durante la entrada de la línea de comandos en main? siempre que los números de matriz sean menores que 16. – Gopal

+0

@gopal Publique el código de "entrada de línea de comando al principal" ... como las otras respuestas señalan, 'HashSet' no ** garantiza ** la clasificación. Nunca. Solo estaba explicando por qué en la situación 'args1' resultó ser ordenada. –

0

HashSet no garantiza la clasificación. Para tener la función de clasificación, use TreeSet o algo similar.

0

java.util.Set garantiza que "no hay elementos duplicados".

java.util.SortedSet garantiza el pedido y "no hay elementos duplicados".

3

Tenga en cuenta que más allá de no garantizar la clasificación, el orden de iteración de HashSet puede cambiar completamente si inserta elementos nuevos. Por ejemplo:

public class TestHashSet { 
    public static void main(String[] foo) { 
     Set<Integer> set = new HashSet<Integer>(); 
     set.addAll(Arrays.asList(new Integer[] {6,9,2,55,100,1,6,8,9})); 
     System.out.println(set); 
     set.addAll(Arrays.asList(new Integer[] {7,3,13,37,66})); 
     System.out.println(set); 
     set.add(42); 
     System.out.println(set); 
    } 
} 

me dio el siguiente resultado:

[1, 100, 2, 55, 6, 8, 9] 
[1, 100, 2, 3, 55, 66, 6, 37, 7, 8, 9, 13] 
[1, 2, 100, 3, 6, 66, 7, 37, 8, 42, 9, 13, 55] 

Note como la inserción de un solo elemento cambió por completo el orden.

Cuestiones relacionadas