Un set è semplicemente una raccolta di oggetti unici. Univoco significa che due oggetti non possono avere gli stessi valori. A seconda dell'implementazione del set, può essere ordinato o meno. Il set Java, come tipo di dati astratto (ADT), ha alcune operazioni chiave (dove T rappresenta qualsiasi tipo di dati, ad esempio int, String o qualsiasi oggetto di classe):
boolean add(T item)
: restituisce true se l'elemento è stato aggiunto correttamente all'insieme e false se l'elemento era già nell'insieme.boolean remove(T item)
: restituisce true se l'elemento è stato rimosso con successo dal set e false in caso contrario (se l'elemento non era nel set).boolean contains(T item)
: restituisce true se l'elemento è nel set e false in caso contrario.boolean isEmpty()
: restituisce vero se l'insieme è vuoto e falso altrimenti.
contains()
funzione offre un ottimo runtime per questo: complessità temporale O(1) o O(log n) a seconda che l'implementazione utilizzata sia a HashSet
o aTreeSet
, rispettivamente. Quindi per cosa potrebbe essere usato un set? Bene, se hai mai bisogno di tenere traccia di molti oggetti distinti, come ID, nomi o altri identificatori univoci, e controllare frequentemente se un elemento esiste in una tale raccolta, allora un set è probabilmente una buona scelta. Ecco un esempio di caso d'uso di un set: immagina di avere un elenco di Student
oggetti che rappresentano tutti gli studenti di una determinata classe. Ognuno Student
potrebbe avere un nome univoco (stringa) e un grado (int) per questa classe. Se volessi fare frequentemente riferimento a un elenco di tutti gli studenti A (voto >=90), sarebbe noioso scorrere questo elenco e controllare ogni volta il voto di ogni studente. Invece, potresti usare a HashSet
of strings che tiene traccia di tutti gli studenti A della classe, in questo modo:
- Ogni volta che i voti degli Studenti vengono aggiornati, puoi semplicemente controllare se il nuovo voto dello Studente è maggiore o uguale a 90 oppure no.
- In tal caso, aggiungili all'insieme degli studenti A che utilizzano
add()
- Se erano già studenti A, questa operazione viene semplicemente ignorata.
- In caso contrario, rimuovili dall'insieme degli studenti A che utilizzano
remove()
- Se a questo punto non erano studenti A, questa operazione viene semplicemente ignorata.
- In tal caso, aggiungili all'insieme degli studenti A che utilizzano
contains(“Johnny Appleseed”)
sul set. Naturalmente, questo è solo un esempio di caso d'uso per un set e questo problema specifico di tenere traccia degli studenti A potrebbe essere risolto in altri modi.
Implementazioni: HashSet in Java e Java TreeSet Esempi
SiaHashSet
in Java che TreeSet
in Java sono disponibili nel formato java.utils package
. Puoi importarli come tali:
// imports everything from Java's util package, including HashSet and TreeSet
import java.util.*;
O
import java.util.HashSet; // imports only the Java HashSet
import java.util.TreeSet; // imports only the Java TreeSet
La differenza fondamentale tra Java HashSet
e Java TreeSet
è che TreeSet
è ordinato, mentre HashSet
non lo è. Questo è il motivo per cui TreeSet
ha complessità temporale O(log n) per le operazioni chiave, mentre HashSet
ha complessità temporale O(1) o costante; il TreeSet
deve mantenere l'ordine in ogni momento. Oltre alle operazioni sugli insiemi di chiavi menzionate in precedenza, sia HashSet
e TreeSet
in Java hanno alcune altre funzioni utili:
void clear()
: cancella l'insieme di tutti gli oggetti.int size()
: restituisce il numero di oggetti nell'insieme.Object clone()
: restituisce una copia superficiale dell'insieme.Iterator iterator()
: restituisce un iteratore all'insieme, a partire dal primo oggetto.
size()
se vuoi vedere quanti studenti 'A' hai avuto, o clear()
se vuoi cancellare l'elenco alla fine del semestre. Potresti usare clone()
per creare e conservare un clone dell'elenco degli studenti A in un momento specifico, ad esempio durante i rapporti intermedi (in questo modo il clone non rimane aggiornato insieme all'originale).
Esempio di hashset Java
Ecco un breve esempio di aHashSet
of String
s utilizzato in 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"));
}
}
Produzione: --------
[Collin, Bob, Abigail]
Bob is in the set (T/F): true
Max is in the set (T/F): false
Esempio Java TreeSet
L'esempio del set Java potrebbe aiutarti a comprendere la teoria. Ecco il breve esempio di aTreeSet
of String
s utilizzato in 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());
}
}
Produzione: -------
[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
È tutto! Spero che questo abbia aiutato 😊
GO TO FULL VERSION