Zestaw to po prostu zbiór unikalnych przedmiotów. Unikalny oznacza, że ​​żadne dwa obiekty nie mogą mieć tej samej wartości. W zależności od wykonania zestawu może być on zamówiony lub nie. Zestaw Java, jako abstrakcyjny typ danych (ADT), ma kilka kluczowych operacji (gdzie T reprezentuje dowolny typ danych, np. int, String lub dowolny obiekt klasy): Zestaw Java jako interfejs — 1
  • boolean add(T item): zwraca true, jeśli element został pomyślnie dodany do zestawu, i false, jeśli element był już w zestawie.
  • boolean remove(T item): zwraca true, jeśli element został pomyślnie usunięty z zestawu, a false w przeciwnym przypadku (jeśli elementu nie było w zestawie).
  • boolean contains(T item): zwraca true, jeśli element jest w zestawie i false w przeciwnym razie.
  • boolean isEmpty(): zwraca true, jeśli zbiór jest pusty, w przeciwnym razie zwraca false.
Zestawy w Javie mają całkiem zrozumiałe sygnatury funkcji (tak jak powinny). Jeśli dodasz dwa identyczne przedmioty do zestawu, w zestawie znajdzie się tylko pierwszy dodany element. Wszystkie kolejne próby dodania tego samego elementu zostaną zignorowane, chyba że element zostanie najpierw usunięty. Jedną z najczęściej używanych operacji na zbiorach jest sprawdzanie, czy element znajduje się w danym zbiorze. Funkcja contains()zapewnia doskonały czas działania: złożoność czasowa O(1) lub O(log n) w zależności od tego, czy zastosowana implementacja to a HashSetczy aTreeSetodpowiednio. Do czego więc może służyć zestaw? Cóż, jeśli kiedykolwiek będziesz musiał śledzić wiele odrębnych obiektów — takich jak identyfikatory, nazwy lub inne unikalne identyfikatory — i często sprawdzać, czy element istnieje w takiej kolekcji, prawdopodobnie dobrym wyborem będzie zestaw. Oto przykładowy przypadek użycia zestawu: Wyobraź sobie, że masz listę Studentobiektów reprezentujących wszystkich uczniów w danej klasie. Każda z nich Studentmoże mieć unikalną nazwę (string) i ocenę (int) dla tej klasy. Jeśli chcesz często odwoływać się do listy wszystkich uczniów A (ocena >=90), przeglądanie tej listy i sprawdzanie ocen każdego ucznia za każdym razem byłoby uciążliwe. Zamiast tego możesz użyć a HashSetof strings, które śledzi wszystkich uczniów A w klasie, jako takich:
  • Za każdym razem, gdy oceny uczniów są aktualizowane, możesz po prostu sprawdzić, czy nowa ocena ucznia jest większa lub równa 90, czy nie.
    • Jeśli tak, dodaj je do zestawu uczniów korzystających z Aadd()
      • Jeśli byli już studentami A, ta operacja jest po prostu ignorowana.
    • Jeśli nie, usuń je z zestawu uczniów Aremove()
      • Jeśli w tym momencie nie był uczniem A, operacja ta jest po prostu ignorowana.
Dzięki takiemu systemowi zawsze będziesz mieć aktualny zestaw wszystkich uczniów „A” w swojej klasie. Jeśli chciałeś sprawdzić, czy Johnny Appleseed dobrze sobie radzi w twojej klasie, możesz to łatwo zrobić, dzwoniąc contains(“Johnny Appleseed”)na plan. Oczywiście jest to tylko jeden przykład przypadku użycia zbioru, a ten konkretny problem śledzenia uczniów A można rozwiązać na inne sposoby.

Implementacje: HashSet w Javie i Java TreeSet Przykłady

Zarówno HashSetin Java, jak i TreeSetin Java są dostępne w formacie java.utils package. Możesz zaimportować je jako takie:

// imports everything from Java's util package, including HashSet and TreeSet
import java.util.*;
Lub

import java.util.HashSet; // imports only the Java HashSet
import java.util.TreeSet; // imports only the Java TreeSet
Kluczowa różnica między Javą HashSeta Javą TreeSetpolega na tym, że the TreeSetjest sortowane, podczas gdy the HashSetnie. To dlatego TreeSetma złożoność czasową O(log n) dla kluczowych operacji, podczas gdy HashSetma O(1) lub stałą złożoność czasową; musi TreeSetcały czas utrzymywać porządek. Oprócz wspomnianych wcześniej operacji na zestawach kluczy, zarówno w Javie HashSet, jak iw TreeSetJavie, mają kilka innych pomocnych funkcji:
  • void clear(): czyści zestaw ze wszystkich obiektów.
  • int size(): zwraca liczbę obiektów w zestawie.
  • Object clone(): zwraca płytką kopię zestawu.
  • Iterator iterator(): zwraca iterator do zbioru, zaczynając od pierwszego obiektu.
Możesz sobie wyobrazić zastosowanie tych funkcji na przykładzie „listy uczniów A”: możesz zadzwonić, size()jeśli chcesz zobaczyć, ilu masz uczniów „A”, lub clear()jeśli chcesz wyczyścić listę na koniec semestru. Możesz użyć clone()do utworzenia i przechowywania klonu listy studentów A w określonym momencie, na przykład podczas sprawozdań śródsemestralnych (w ten sposób klon nie pozostaje aktualny wraz z oryginałem).

Przykład Java HashSet

Oto krótki przykład użycia a HashSetof s w Javie:String

import java.util.HashSet;
class HashSetDemo {
    public static void main(String[] args)
    {
	  // create a HashSet of Strings
        HashSet<String> hs = new HashSet<String>();
  
        // Add elements using the add() method
        hs.add("Collin");
	  hs.add("Bob");
 	  hs.add("Abigail");
  
        // Duplicates will ignored; this statement is useless
        hs.add("Collin");
  
        
        System.out.println(hs);
	  System.out.println("Bob is in the set (T/F): " + hs.contains("Bob"));
  System.out.println("Max is in the set (T/F): " + hs.contains("Max"));


    }
}
Wyjście: --------

[Collin, Bob, Abigail]
Bob is in the set (T/F): true
Max is in the set (T/F): false

Przykład Java TreeSet

Przykład zestawu Java może pomóc ci zrozumieć teorię. Oto krótki przykład użycia a TreeSetof s w Javie:String

import java.util.TreeSet;
class TreeSetDemo {
    public static void main(String[] args)
    {
	  // create a TreeSet of Strings
        TreeSet<String> ts = new TreeSet<String>();
  
        // Add elements using the add() method.
        ts.add("Collin");
	  ts.add("Bob");
 	  ts.add("Abigail");
  
        // Duplicates will ignored; this statement is useless
        ts.add("Collin");
  
        // printing the set prints the names in alphabetical order!
        System.out.println(ts); 
	  
	  System.out.println("Bob is in the set (T/F): " + ts.contains("Bob"));
  System.out.println("Max is in the set (T/F): " + ts.contains("Max"));
  System.out.println("Size of the set: " + ts.size());
 	  ts.clear();
	  System.out.println("Size of the set after clear(): " + ts.size());
        

    }
}
Wyjście: -------

[Abigail, Bob, Collin]
Bob is in the set (T/F): true
Max is in the set (T/F): false
Size of the set: 3
Size of the set after clear(): 0
To wszystko! Mam nadzieję, że to pomogło 😊