CodeGym /Blog Java /Random-PL /Zestaw Javy
Autor
Jesse Haniel
Lead Software Architect at Tribunal de Justiça da Paraíba

Zestaw Javy

Opublikowano w grupie Random-PL
Set to interfejs w środowisku Java Collection Framework. Możesz użyć Java Set do implementacji nieuporządkowanych kolekcji z unikalnymi elementami. W tym artykule przyjrzymy się temu interfejsowi i jego implementacjom w języku Java, metodom pracy ze zbiorem, a także podamy kilka przykładów.

Co to jest zestaw Java

Set to interfejs z Java Collection Framework, ale Set nie jest kolekcją uporządkowaną, w przeciwieństwie do List . Oznacza to, że elementy zestawu Java Set są przechowywane bez określonej kolejności. Nie ma więc kontroli nad pozycją, w której można wstawić element. Ponadto nie można uzyskać dostępu do elementów według ich indeksu. Z matematycznego punktu widzenia zestaw to zbiór unikalnych elementów. W rzeczywistości jest to kolekcja nieuporządkowana (kolekcja nieuporządkowana), w której nie można przechowywać identycznych elementów. Jeśli celowo dodasz zduplikowany element do zestawu , ta akcja zostanie zignorowana, a zestaw się nie zmieni. Dopuszczalne jest jednak przechowywanie w nim jednego elementu zerowego.

Ustaw implementacje

Java Set to interfejs, więc do tworzenia obiektów musisz użyć jednej z jego implementacji. Są to HashSet , TreeSet i LinkedHashSet . W Set s każdy element jest przechowywany tylko w jednej instancji, a różne implementacje Set używają innej kolejności przechowywania elementów. W HashSet kolejność elementów jest określana przez złożony algorytm. Jeśli kolejność przechowywania jest dla Ciebie ważna, użyj kontenera TreeSet , który przechowuje obiekty posortowane rosnąco w porządku porównawczym lub LinkedHashSet, który przechowuje elementy w kolejności dodawania. Zestawy są często używane do testowania przynależności, dzięki czemu można łatwo sprawdzić, czy obiekt należy do danego zestawu, więc w praktyce zwykle wybiera się implementację HashSet , która jest zoptymalizowana pod kątem szybkiego wyszukiwania. HashSet to kolekcja, która wykorzystuje swoje wartości hash zwracane przez metodę hashCode() do wewnętrznego przechowywania elementów. Oznacza to, że wewnątrz HashSet<E> przechowywany jest obiekt HashMap <E, Object> , który przechowuje wartości HashSet jako klucze. Korzystanie z kodów skrótu umożliwia szybkie wyszukiwanie, dodawanie i usuwanie elementów ze zbioru . LinkedHashSet to HashSetktóry przechowuje również elementy na połączonej liście. Normalny HashSet nie zachowuje kolejności elementów. Po pierwsze, oficjalnie po prostu nie istnieje, a po drugie, nawet porządek wewnętrzny może diametralnie się zmienić, gdy doda się tylko jeden element. I możesz pobrać iterator z LinkedHashSet i użyć go do przejrzenia wszystkich elementów w dokładnej kolejności, w jakiej zostały dodane do LinkedHashSet . Nie często, ale czasami może to być bardzo potrzebne. TreeSet to kolekcja, która przechowuje elementy jako drzewo uporządkowane według wartości. Wewnątrz TreeSet<E> znajduje się TreeMap<E, Object> , który przechowuje wszystkie te wartości. I ta mapa drzewaużywa czerwono-czarnego zrównoważonego drzewa binarnego do przechowywania elementów. Dlatego ma bardzo szybkie operacje add() , remove() , zawiera() .

Utwórz ustawiony obiekt

Aby utworzyć Set Object, możesz użyć jednego z następujących formularzy:

Set<Integer> intSet = new HashSet<>();
Set<String> vSet = new HashSet<>();
Set mySet = new LinkedHashSet();
HashSet<String> myHashset = new HashSet<>();
Oto prosty przykład, w którym tworzymy 2 Set s, HashSet i LinkedHashSet , i dodajemy do każdego z nich po 5 elementów. W tym celu możemy użyć metody add() .

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;

public class HashSetTest {
    public static void main(String[] args) {
        Set mySet = new HashSet();
        Set mySet2 = new LinkedHashSet();
//adding some string elements
        mySet.add("Stuart");
        mySet.add("Alex");
        mySet.add("Johnny");
        mySet.add("Igor");
        mySet.add("Bel");
        System.out.println(mySet);
        mySet2.add("Stuart");
        mySet2.add("Alex");
        mySet2.add("Johnny");
        mySet2.add("Igor");
        mySet2.add("Bel");
        System.out.println(mySet2);
    }
}
Oto wynik działania programu:
[Alex, Igor, Stuart, Johnny, Bel] [Stuart, Alex, Johnny, Igor, Bel]
Jak wspomnieliśmy powyżej, HashSet nie zachowuje kolejności elementów, ale LinkedHashSet tak. To LinkedHashSet dał nam elementy w kolejności, w jakiej je wpisaliśmy do zestawu.

Metody zestawów Java

Oto niektóre z ważnych metod Java Set :
  • boolean add(E e) . Dodaje określony element do zestawu, jeśli jeszcze go nie ma (operacja opcjonalna).

  • boolowskie usuń (Obiekt o) . Usuwa określony element z tego zestawu, jeśli jest obecny (operacja opcjonalna).

  • wartość logiczna usuń wszystko(kolekcja c) . Usuwa z tego zestawu wszystkie jego elementy, które są zawarte w określonej kolekcji (operacja opcjonalna).

  • wartość logiczna zachowaj wszystko (kolekcja c) . Zachowuje tylko te elementy z tego zestawu, które są zawarte w określonej kolekcji (operacja opcjonalna).

  • nieważne wyczyść() . Usuwa wszystkie elementy z zestawu.

  • Iterator iterator() . Zwraca iterator dla elementów w tym zestawie.

  • rozmiar int() . służy do uzyskania liczby elementów w zbiorze.

  • wartość logiczna isEmpty() . aby sprawdzić, czy zestaw jest pusty, czy nie.

  • wartość logiczna zawiera (Obiekt o) . Zwraca wartość true, jeśli ten zestaw zawiera określony element.

  • Iterator iterator() . Zwraca iterator dla elementów w tym zestawie. Elementy są zwracane w dowolnej kolejności.

  • Obiekt[] toArray() . Zwraca tablicę zawierającą wszystkie elementy w tym zestawie. Jeśli ten zestaw daje jakiekolwiek gwarancje, w jakiej kolejności jego elementy są zwracane przez iterator, ta metoda musi zwracać elementy w tej samej kolejności.

Metody są podobne do metod ArrayList , z tą różnicą, że metoda add(Object o) dodaje obiekt do zestawu tylko wtedy, gdy jeszcze go tam nie ma. Wartość zwracana przez metodę to prawda, jeśli obiekt został dodany, a fałsz w przeciwnym razie. Istnieją również metody odziedziczone po interfejsie Collection<> : parallelStream() , removeIf() , stream() i forEach() odziedziczone po interfejsie java.lang.Iterable .

Przykład głównych operacji Java Set

W tym przykładzie tworzymy tablicę ciągów znaków, a następnie przekazujemy ją do mySet za pomocą operacji Arrays.asList . Następnie usuwamy jeszcze kilka elementów i dodajemy jeszcze kilka. W takim przypadku jeden z elementów zestawu już istnieje: nie zostanie dodany. Wypróbujemy również operacje sprawdzenia pustki isEmpty() , określenia wielkości zestawu size() oraz wyczyszczenia zbioru ze wszystkich elementów clear() .

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class HashSetTest2 {
   public static void main(String[] args) {
       //creating a string Array with some names
       String [] friends =  {"Stuart", "Ivy", "Johnny", "Alex", "Igor", "Tanya"};
       //creating a new set and adding elements from string array into it
       Set<String> mySet = new HashSet<>(Arrays.asList(friends));
       System.out.println(mySet);
       //removing two elements from the set
       mySet.remove("Igor");
       mySet.remove("Stuart");

       System.out.println(mySet);

       //adding 2 new Elements into set
       mySet.add("Dasha");
       mySet.add("Alex"); //it's second Alex, can't be added
       System.out.println(mySet);
       //cheking the size of mySet
       int size = mySet.size();
       System.out.println("The quantity of set's elements = " + size);
       //Checking if the set is empty
       System.out.println("Is mySet empty? " + mySet.isEmpty());
       //checking if some elements are in set
       System.out.println("Is Igor in set? " + mySet.contains("Igor"));
       System.out.println("Is Johnny in set? "+ mySet.contains("Johnny"));
       //deleting all elements from the set
       mySet.clear();
       System.out.println("Is mySet empty now? " + mySet.isEmpty());

   }
}
Wyjście programu jest tutaj:
[Alex, Igor, Stuart, Tanya, Johnny, Ivy] [Alex, Tanya, Johnny, Ivy] [Alex, Dasha, Tanya, Johnny, Ivy] Ilość elementów zestawu = 5 Czy mójZbiór jest pusty? false Czy Igor jest w zestawie? false Czy Johnny jest w zestawie? true Czy mySet jest teraz pusty? PRAWDA

Przykład z LinkedHashSet i ustawionym na Array

Napiszmy inny program. W nim utworzymy zestaw na podstawie LinkedHashSet , dodamy do niego elementy, a następnie przekonwertujemy zestaw na tablicę.

import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
   public class LinkedHashSet3 {
       public static void main(String[] args) {
           Set<String> set = new LinkedHashSet<>();
           set.add("C");
           set.add("D");
           set.add("E");
           set.add("F");
           set.add("G");
           set.add("A");
           set.add("B");
           System.out.println(set);
           set.remove("F");// removing an element from our set
           set.remove("C sharp");//trying to remove element that isn't in set
           System.out.println(set.remove("C sharp"));
           System.out.println("Print our set with elements removed: ");
           System.out.println(set);

//set to array
           String strArray[] = set.toArray(new String[set.size()]);
           System.out.println("New Array from set: ");
           System.out.println(Arrays.toString(strArray));
           System.out.println(strArray[0]);

       }
   }
Oto wynik działania programu:
[C, D, E, F, G, A, B] false Wydrukuj nasz zestaw z usuniętymi elementami: [C, D, E, G, A, B] Nowa tablica ze zbioru: [C, D, E, G, A, B] C

Ustaw przykład za pomocą iteratora

Stwórzmy zbiór, następnie wydrukujmy go za pomocą iteratora, a następnie usuńmy z niego wszystkie liczby parzyste, również za pomocą iteratora.

import java.util.*;

public class SetTest5
{
   public static void main(String[] args)
   {

       Set<Integer> mySet = new HashSe<>();
       for(int i = 0; i < 10; i++)
           mySet.add(i);

       Iterator iterator = mySet.iterator();

       //simple iteration
       while(iterator.hasNext()){
           int i = (int) iterator.next();
       }
       System.out.println(" " + mySet);

       //modification of mySet using iterator - removing all even numbers
       iterator = mySet.iterator();
       while(iterator.hasNext()){
           int x = (int) iterator.next();
           if(x%2 == 0) iterator.remove();
       }
       System.out.println(mySet);

       }
}
Wyjście programu jest tutaj:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 3, 5, 7, 9

Przykład z TreeSet

Jeśli sortowanie jest dla Ciebie ważne, użyj implementacji TreeSet . W tym krótkim przykładzie uzupełnimy zestaw imionami przyjaciół, tak jak w poprzednich przykładach. Jednak w posortowanym TreeSet elementy zostaną natychmiast zapisane w posortowanej kolejności. W takim przypadku nazwy będą wyświetlane alfabetycznie.

import java.util.Set;
import java.util.TreeSet;
public class TreeSetTest {

   public static void main(String[] args) {

       Set mySet = new TreeSet<>();
       mySet.add("Stuart");
       mySet.add("Alex");
       mySet.add("Johnny");
       mySet.add("Igor");
       mySet.add("Bel");
       System.out.println(mySet);

   }
Dane wyjściowe to:
[Alex, Bel, Igor, Johnny, Stuart]

Krótkie wnioski

  • Interfejs Java Set jest częścią środowiska Java Collections Framework.

  • Zaimplementowane klasy: AbstractSet , ConcurrentHashMap.KeySetView , ConcurrentSkipListSet , CopyOnWriteArraySet , EnumSet , HashSet , JobStateReasons , LinkedHashSet , TreeSet .

  • Najpopularniejsze implementacje Set to HashSet , LinkedHashSet i TreeSet .

  • Kolejność elementów HashSet jest określana przez złożony algorytm. Jeśli kolejność przechowywania jest dla Ciebie ważna, użyj kontenera TreeSet , który przechowuje obiekty posortowane rosnąco w kolejności porównania, lub LinkedHashSet , który przechowuje elementy w kolejności dodawania.

  • Najczęściej zestawy służą do testowania członkostwa. Czyli sprawdzić, czy obiekt należy do danego zbioru w sensie matematycznym. Tak więc najczęściej ze wszystkich implementacji Set w praktyce, zwykle wybierany jest HashSet . Ta implementacja jest zoptymalizowana pod kątem szybkiego wyszukiwania.

  • Nie możesz dodawać zduplikowanych elementów do zestawu, więc możesz użyć implementacji interfejsu Set do przechowywania unikalnych elementów.

  • Zestaw umożliwia dodanie tylko jednego elementu zerowego.

  • Zestaw nie jest listą i nie obsługuje indeksów ani pozycji jego elementów.

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION