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):
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.
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 HashSet
czy aTreeSet
odpowiednio. 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ę Student
obiektów reprezentujących wszystkich uczniów w danej klasie. Każda z nich Student
moż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 HashSet
of 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 A
add()
- Jeśli byli już studentami A, ta operacja jest po prostu ignorowana.
- Jeśli nie, usuń je z zestawu uczniów A
remove()
- Jeśli w tym momencie nie był uczniem A, operacja ta jest po prostu ignorowana.
- Jeśli tak, dodaj je do zestawu uczniów korzystających z A
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ównoHashSet
in Java, jak i TreeSet
in 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ą HashSet
a Javą TreeSet
polega na tym, że the TreeSet
jest sortowane, podczas gdy the HashSet
nie. To dlatego TreeSet
ma złożoność czasową O(log n) dla kluczowych operacji, podczas gdy HashSet
ma O(1) lub stałą złożoność czasową; musi TreeSet
cały czas utrzymywać porządek. Oprócz wspomnianych wcześniej operacji na zestawach kluczy, zarówno w Javie HashSet
, jak iw TreeSet
Javie, 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.
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 aHashSet
of 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 aTreeSet
of 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 😊
GO TO FULL VERSION