Et sæt er simpelthen en samling af unikke genstande. Unik betyder, at ikke to objekter kan have samme værdi(er). Afhængigt af implementeringen af sættet, kan det eller måske ikke bestilles. Java-sættet, som en abstrakt datatype (ADT), har nogle få nøgleoperationer (hvor T repræsenterer enhver datatype, f.eks. int, streng eller et hvilket som helst klasseobjekt):

boolean add(T item)
: returnerer sandt, hvis elementet er føjet til sættet, og falsk, hvis elementet allerede var i sættet.boolean remove(T item)
: returnerer true, hvis varen blev fjernet fra sættet og falsk ellers (hvis varen ikke var i sættet).boolean contains(T item)
: returnerer true, hvis varen er i sættet og ellers falsk.boolean isEmpty()
: returnerer sand, hvis sættet er tomt og ellers falsk.
contains()
giver en fantastisk køretid til dette: O(1) eller O(log n) tidskompleksitet afhængig af om den anvendte implementering er en HashSet
eller enTreeSet
, henholdsvis. Så hvad kan et sæt bruges til? Nå, hvis du nogensinde har brug for at holde styr på mange forskellige objekter - såsom id'er, navne eller andre unikke identifikatorer - og ofte kontrollere, om et element findes i en sådan samling, så er et sæt sandsynligvis et godt valg. Her er et eksempel på brugen af et sæt: Forestil dig, at du har en liste over Student
objekter, der repræsenterer alle eleverne i en given klasse. Hver Student
kan have et unikt navn (streng) og karakter (int) for denne klasse. Hvis du ofte ville referere til en liste over alle A-elever (karakter >=90), ville det være trættende at gå gennem denne liste og tjekke hver elevs karakter hver gang. I stedet kan du bruge en HashSet
af strenge, som holder styr på alle A-elever i klassen, som sådan:
- Hver gang elevernes karakterer opdateres, kan du blot tjekke, om Elevens nye karakter er større end eller lig med 90 eller ej.
- Hvis ja, føj dem til sættet af A-elever ved hjælp af
add()
- Hvis de allerede var A-studerende, ignoreres denne handling simpelthen.
- Hvis ikke, så fjern dem fra sættet af A-elever ved hjælp af
remove()
- Hvis de ikke var A-studerende på dette tidspunkt, så ignoreres denne handling simpelthen.
- Hvis ja, føj dem til sættet af A-elever ved hjælp af
contains(“Johnny Appleseed”)
på settet. Dette er selvfølgelig kun et eksempel på en use case for et sæt, og dette specifikke problem med at holde styr på A-elever kunne løses på andre måder.
Implementeringer: HashSet i Java og Java TreeSet eksempler
BådeHashSet
i Java og TreeSet
i Java kommer i java.utils package
. Du kan importere dem som sådan:
// imports everything from Java's util package, including HashSet and TreeSet
import java.util.*;
eller
import java.util.HashSet; // imports only the Java HashSet
import java.util.TreeSet; // imports only the Java TreeSet
Den vigtigste forskel mellem Java HashSet
og Java TreeSet
er, at den TreeSet
er sorteret, mens den HashSet
ikke er det. Dette er grunden til, at den TreeSet
har O(log n) tidskompleksitet for nøgleoperationer, hvorimod HashSet
den har O(1) eller konstant tidskompleksitet; skal TreeSet
holde orden til enhver tid. Ud over de tidligere nævnte nøglesæt-operationer, har både HashSet
og TreeSet
i Java et par andre nyttige funktioner:
void clear()
: rydder sættet af alle objekter.int size()
: returnerer antallet af objekter i sættet.Object clone()
: returnerer en overfladisk kopi af sættet.Iterator iterator()
: returnerer en iterator til sættet, startende ved det første objekt.
size()
hvis du ville se, hvor mange 'A'-elever du havde, eller clear()
hvis du ville rydde listen i slutningen af semesteret. Du kan bruge clone()
til at oprette og beholde en klon af listen over A-elever på et bestemt tidspunkt, f.eks. under midtvejsrapporter (på denne måde forbliver klonen ikke opdateret sammen med originalen).
Eksempel på Java HashSet
Her er et kort eksempel på enHashSet
af String
s, der bruges i Java:
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"));
}
}
Output: --------
[Collin, Bob, Abigail]
Bob is in the set (T/F): true
Max is in the set (T/F): false
Java TreeSet eksempel
Java-eksempel kan hjælpe dig med at forstå teorien. Her er det korte eksempel på enTreeSet
af String
s, der bruges i Java:
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());
}
}
Udgang: -------
[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
Det er alt! Håber dette hjalp 😊
GO TO FULL VERSION