Ein Set ist einfach eine Sammlung einzigartiger Objekte. Einzigartig bedeutet, dass keine zwei Objekte denselben Wert bzw. dieselben Werte haben können. Abhängig von der Implementierung des Sets kann es bestellt werden oder nicht. Der Java-Satz als abstrakter Datentyp (ADT) verfügt über einige Schlüsseloperationen (wobei T einen beliebigen Datentyp darstellt, z. B. int, String oder ein beliebiges Klassenobjekt):
boolean add(T item)
: gibt true zurück, wenn das Element erfolgreich zum Set hinzugefügt wurde, und false, wenn das Element bereits im Set war.boolean remove(T item)
: gibt true zurück, wenn das Element erfolgreich aus der Menge entfernt wurde, andernfalls false (wenn das Element nicht in der Menge enthalten war).boolean contains(T item)
: Gibt „true“ zurück, wenn das Element in der Menge ist, andernfalls „false“.boolean isEmpty()
: Gibt true zurück, wenn die Menge leer ist, andernfalls false.
contains()
Funktion bietet dafür eine hervorragende Laufzeit: O(1) oder O(log n) Zeitkomplexität, je nachdem, ob die verwendete Implementierung a HashSet
oder a istTreeSet
, bzw. Wofür könnte ein Set also verwendet werden? Nun, wenn Sie jemals den Überblick über viele unterschiedliche Objekte – wie IDs, Namen oder andere eindeutige Identifikatoren – behalten und häufig überprüfen müssen, ob ein Element in einer solchen Sammlung vorhanden ist, dann ist ein Set wahrscheinlich eine gute Wahl. Hier ist ein Beispiel für den Anwendungsfall einer Menge: Stellen Sie sich vor, Sie haben eine Liste von Student
Objekten, die alle Schüler einer bestimmten Klasse repräsentieren. Jeder Student
kann einen eindeutigen Namen (string) und eine eindeutige Note (int) für diese Klasse haben. Wenn Sie häufig auf eine Liste aller A-Schüler (Note >=90) verweisen möchten, wäre es mühsam, diese Liste zu durchlaufen und jedes Mal die Note jedes Schülers zu überprüfen. Stattdessen könnten Sie eine Reihe HashSet
von Zeichenfolgen verwenden, die alle A-Schüler in der Klasse im Auge behält, etwa so:
- Jedes Mal, wenn die Noten der Schüler aktualisiert werden, können Sie einfach überprüfen, ob die neue Note des Schülers größer oder gleich 90 ist oder nicht.
- Wenn ja, fügen Sie sie der Menge der A-Schüler hinzu, die sie verwenden
add()
- Wenn sie bereits ein A-Schüler waren, wird dieser Vorgang einfach ignoriert.
- Wenn nicht, entfernen Sie sie aus der Gruppe der A-Schüler, die sie verwenden
remove()
- Wenn sie zu diesem Zeitpunkt kein A-Schüler waren, wird dieser Vorgang einfach ignoriert.
- Wenn ja, fügen Sie sie der Menge der A-Schüler hinzu, die sie verwenden
contains(“Johnny Appleseed”)
am Set vorbeischauen. Dies ist natürlich nur ein Beispiel für einen Anwendungsfall für ein Set, und dieses spezielle Problem, den Überblick über A-Schüler zu behalten, könnte auf andere Weise gelöst werden.
Implementierungen: HashSet in Java und Java TreeSet-Beispiele
Sowohl dieHashSet
in Java als auch die TreeSet
in Java kommen in der java.utils package
. Sie können sie als solche importieren:
// imports everything from Java's util package, including HashSet and TreeSet
import java.util.*;
oder
import java.util.HashSet; // imports only the Java HashSet
import java.util.TreeSet; // imports only the Java TreeSet
Der Hauptunterschied zwischen Java HashSet
und Java TreeSet
besteht darin, dass das TreeSet
sortiert ist, das jedoch HashSet
nicht. Aus diesem Grund TreeSet
hat die eine O(log n)-Zeitkomplexität für Schlüsseloperationen, wohingegen sie HashSet
eine O(1)- oder konstante Zeitkomplexität hat; Sie TreeSet
müssen jederzeit für Ordnung sorgen. Zusätzlich zu den zuvor erwähnten Schlüsselsatzoperationen verfügen sowohl die HashSet
als auch TreeSet
in Java über einige weitere hilfreiche Funktionen:
void clear()
: löscht die Menge aller Objekte.int size()
: gibt die Anzahl der Objekte in der Menge zurück.Object clone()
: Gibt eine flache Kopie des Satzes zurück.Iterator iterator()
: Gibt einen Iterator an die Menge zurück, beginnend beim ersten Objekt.
size()
wenn Sie sehen möchten, wie viele A-Studenten Sie haben, oder clear()
wenn Sie die Liste am Ende des Semesters löschen möchten. Sie können damit clone()
einen Klon der Liste der A-Studenten zu einem bestimmten Zeitpunkt erstellen und aufbewahren, beispielsweise bei Zwischenberichten (auf diese Weise bleibt der Klon nicht zusammen mit dem Original auf dem neuesten Stand).
Java HashSet-Beispiel
Hier ist ein kurzes Beispiel für die Verwendung einesHashSet
of s in Java: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"));
}
}
Ausgang: --------
[Collin, Bob, Abigail]
Bob is in the set (T/F): true
Max is in the set (T/F): false
Java TreeSet-Beispiel
Ein Java-Set-Beispiel könnte Ihnen helfen, die Theorie zu verstehen. Hier ist das kurze Beispiel für die Verwendung von aTreeSet
of s in Java: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());
}
}
Ausgang: -------
[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
Das ist alles! Hoffe das hat geholfen 😊
GO TO FULL VERSION