2011-01-14 21 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); 
} 
} 

Pytanie: w przypadku HashSet z odniesieniem S, HashSet nie jest posortowane. Ale dla odniesienia S1, HashSet jest sortowany. Dlaczego tak?HashSet nie sortuje?

+0

Proszę używać znaczników kodu. Będzie bardziej czytelny! –

+0

Czy możesz podać wynik? –

+0

wyjściowa: zduplikowane elementem 6 zduplikowane elementem 9 [1, 100 2, 55, 6, 8, 9] Hashset zduplikowane elementu 3 [2, 3, 5, 6] HashSet zduplikowane element 6 zduplikowane element 9 [1, 2, 6, 8, 9, 55, 100] TreeSet Duplikat elementu 6 Duplikat elementu 9 [6, 9, 2, 55, 100, 1, 8] LinkedHashSet – Gopal

Odpowiedz

5

HashSet to absolutnie nie gwarantuje się sortowania. Zamawianie nie jest gwarantowane w ogóle.

Z dokumentacji metody iterator():

Zwraca iterator nad elementami w tym zbiorze. Elementy są zwracane w dowolnej kolejności.

HashSet został zaprojektowany tak, aby wstawiać i sprawdzać obecność elementów bardzo szybko, przez równość. To wszystko.

Jeśli potrzebujesz sortowania, użyj implementacji SortedSet, takiej jak TreeSet lub ConcurrentSkipListSet.

3

HashSet stosowane mod przechowywać liczbę na wejściu wiadro

W args1 tablicy całej ilości jest mniejsza niż 16 - domyślna wielkość HashSet. dlatego kończy się sortowaniem.

+0

jeśli tak, to dlaczego nie jest sortowane podczas wprowadzania wiersza poleceń do głównej? pod warunkiem, że numery macierzy są mniejsze niż 16. – Gopal

+0

@gopal Proszę napisać kod "wejście linii poleceń do głównego" ... jak wskazują inne odpowiedzi, 'HashSet' ma ** nie ** gwarantuje sortowanie. nigdy. Właśnie wyjaśniałem, dlaczego w sytuacji "args1" zdarzyło się, że został posortowany. –

0

HashSet nie gwarantuje sortowania. Aby mieć funkcję sortowania, użyj TreeSet lub czegoś podobnego.

0

java.util.Set gwarantuje "brak duplikatów elementów".

java.util.SortedSet gwarantuje zamawianie i "brak duplikatów elementów".

3

Należy pamiętać, że oprócz niezapewnienia sortowania, kolejność iteracji może się całkowicie zmienić po wstawieniu nowych elementów. Na przykład:

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); 
    } 
} 

Dał mi następujący wynik:

[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] 

zauważyć, jak wkładanie jednego elementu zmienia się całkowicie w porządku.