Zbiór - interfejs Set oraz klasa HashSet
Zbiór (ang. set) służy do przechowywania unikatowych elementów.
Nie możemy bezpośrednio uzyskać dostępu do pojedynczych elementów zbioru, lecz jedynie do iteratora, pozwalającego pobierać kolejne elementy zbioru. W zależności od użytej implementacji interfejsu Set elementy mogą być pobierane w porządku posortowanym lub losowym.
Set (zbiór) to rodzaj kolekcji, w której kolejność elementów nie jest istotna i nie jest utrzymywana (może się zmieniać z upływem czasu).
Pojedynczy element może wystąpić w kolekcji Set tylko raz. Unikatowość elementu jest określana przy użyciu metod equals() oraz hashCode() każdego obiektu (patrz Metoda equals() oraz Metoda hashCode()). Aby kolekcja Set działała poprawnie, w obiektach umiszczonych w tej kolekcji muszą być prawidłowo zaimplementowane metody equals() oraz hashCode().
package java.util.Set;
public interface Set<E>
extends Collection<E> // interfejs Set dziedziczy od interfejsu Collection
// gdzie E to typ elementów w danym zbiorze (w danej kolekcji)
Istnieje wiele użytecznych klas implementujących interfejs Set - patrz akapit All Known Implementing Classes na stronie https://docs.oracle.com/javase/8/docs/api/java/util/Set.html.
Najbardziej powrzechnie używana to:
- HashSet - zbiór wspomagany przez tablicę mieszającą (ang. hash table, tablica z haszowaniem); HashSet używany jest, gdy zachodzi częsta potrzeba sprawdzania, czy dany element już istnieje w kolekcji, gdy chcemu utworzyć zbiór unikatowych elementów.
- TreeSet - zbiór posortowanych elementów; sortowanie następuje już w chwili dodawania elementu do kolekcji; iterowanie zwraca posortowane elementy.
Warto deklarować zmienną typu zbiór przy użyciu nazwy interfejsu Set, wówczas łatwa będzie ewentualna transformacja kodu z jednej impementacji interfejsu Set na inną.
Przykład:
Set zbiór1 = new HashSet();
Set<String> zbiórStringów = new HashSet<String>( 30 ); // 30 to inicjalny rozmiar zbioru
Kilka podstawowych metod dostępnych w klasie HashSet:
- add( E element ); // dodaje element typu E do zbioru, o ile ten element nie jest już dodany; gdzie E to dowolny typ/klasa elementów - obiektów;
- remove( Object o ); // usuwa ze zbioru podany obiekt
- size(); // zwraca liczbę elementów w zbiorze
- clear(); // usuwa wszystkie elementy ze zbioru
- contains( Object o ); // zwraca true, jeśli dany obiekt znajduje się w zbiorze
Przykład użycia zbioru HashSet:
Set<String> zbiór = new HashSet<String>();
zbiór.add( "łańcuch-1" );
zbiór.add( "łańcuch-2" );
zbiór.add( "łańcuch-3" );
// Display each element of the set
for( String setElement : zbiór ) {
System.out.println( setElement );
}
Wynikowa lista elementów może być różna - różna może być kolejność elementów zbioru. Może np. pojawić się następujący wydruk:
łańcuch-1
łańcuch-3
łańcuch-2