En uppsättning är helt enkelt en samling unika föremål. Unikt betyder att inga två objekt kan ha samma värde. Beroende på implementeringen av uppsättningen kan den beställas eller inte. Java-uppsättningen, som en abstrakt datatyp (ADT), har några nyckeloperationer (där T representerar vilken datatyp som helst, t.ex. int, String eller vilket klassobjekt som helst):
boolean add(T item)
: returnerar sant om objektet har lagts till i setet, och falskt om objektet redan fanns i setet.boolean remove(T item)
: returnerar sant om objektet har tagits bort från setet och falskt annars (om objektet inte fanns i setet).boolean contains(T item)
: returnerar sant om objektet är i uppsättningen och falskt annars.boolean isEmpty()
: returnerar sant om uppsättningen är tom och annars falsk.
contains()
ger en utmärkt körtid för detta: O(1) eller O(log n) tidskomplexitet beroende på om implementeringen som används är en HashSet
eller enTreeSet
, respektive. Så vad kan ett set användas till? Tja, om du någon gång behöver hålla reda på många distinkta objekt - såsom ID, namn eller andra unika identifierare - och ofta kontrollera om ett objekt finns i en sådan samling, är en uppsättning troligen ett bra val. Här är ett exempel på användningen av en uppsättning: Föreställ dig att du har en lista med Student
objekt som representerar alla elever i en viss klass. Var och en Student
kan ha ett unikt namn (sträng) och betyg (int) för den här klassen. Om du ofta vill referera till en lista över alla A-elever (betyg >=90) skulle det vara tråkigt att gå igenom den här listan och kontrollera varje elevs betyg varje gång. Istället kan du använda en HashSet
av strängar som håller reda på alla A-elever i klassen, som sådan:
- Varje gång elevernas betyg uppdateras kan du helt enkelt kontrollera om elevens nya betyg är större än eller lika med 90 eller inte.
- Om så är fallet, lägg till dem i uppsättningen A-elever som använder
add()
- Om de redan var A-student ignoreras denna operation helt enkelt.
- Om inte, ta sedan bort dem från uppsättningen av A-elever som använder
remove()
- Om de inte var en A-student vid det här laget ignoreras denna operation helt enkelt.
- Om så är fallet, lägg till dem i uppsättningen A-elever som använder
contains(“Johnny Appleseed”)
på setet. Naturligtvis är detta bara ett exempel på ett användningsfall för en uppsättning, och detta specifika problem med att hålla reda på A-elever skulle kunna lösas på andra sätt.
Implementeringar: HashSet i Java och Java TreeSet Exempel
BådeHashSet
i Java och TreeSet
i Java kommer i java.utils package
. Du kan importera dem som sådana:
// 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 viktigaste skillnaden mellan Java HashSet
och Java TreeSet
är att den TreeSet
är sorterad, medan den HashSet
inte är det. Det är därför som TreeSet
har O(log n) tidskomplexitet för nyckeloperationer, medan den HashSet
har O(1) eller konstant tidskomplexitet; måste TreeSet
hålla ordning hela tiden. Förutom tangentuppsättningsoperationerna som nämnts tidigare, har både HashSet
och TreeSet
i Java några andra användbara funktioner:
void clear()
: rensar uppsättningen av alla objekt.int size()
: returnerar antalet objekt i uppsättningen.Object clone()
: returnerar en ytlig kopia av setet.Iterator iterator()
: returnerar en iterator till uppsättningen, med början vid det första objektet.
size()
om du vill se hur många A-elever du hade, eller clear()
om du vill rensa listan i slutet av terminen. Du kan använda clone()
för att skapa och behålla en klon av listan över A-elever vid en specifik tidpunkt, till exempel under halvtidsrapporter (på så sätt förblir klonen inte uppdaterad tillsammans med originalet).
Exempel på Java HashSet
Här är ett kort exempel på enHashSet
av String
s som används 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"));
}
}
Utgång: --------
[Collin, Bob, Abigail]
Bob is in the set (T/F): true
Max is in the set (T/F): false
Java TreeSet exempel
Java-exempel kan hjälpa dig att förstå teorin. Här är det korta exemplet på ettTreeSet
av String
s som används 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());
}
}
Utgång: -------
[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 är allt! Hoppas detta hjälpte 😊
GO TO FULL VERSION