Java PriorityQueue Class: Guida per Principianti
Introduzione
Ciao, futuri programmatori Java! Oggi, esploreremo il meraviglioso mondo di PriorityQueue in Java. Non preoccupatevi se non avete mai sentito parlare di esso prima – inizieremo dall'inizio e lavoreremo insieme verso l'alto. Pensate a PriorityQueue come una speciale tipo di coda (o queue) dove la persona o l'oggetto più importante va sempre per primo. Emozionante, vero? Iniziamo!
Dichiarazione della Classe
In Java, la classe PriorityQueue fa parte del Java Collections Framework. È come una lista VIP per i vostri dati! Ecco come la dichiarate:
import java.util.PriorityQueue;
PriorityQueue<ElementType> pq = new PriorityQueue<>();
Sostituite ElementType
con il tipo di dati che volete memorizzare, come Integer, String o anche i vostri oggetti personalizzati (ma vedremo questo più tardi).
Parametri
Quando create una PriorityQueue, puoi specificare alcuni parametri opzionali:
- Capacità iniziale: Quanti elementi può contenere all'inizio.
- Comparator: Un oggetto speciale che decide l'ordine degli elementi.
Ecco un esempio:
PriorityQueue<Integer> pq = new PriorityQueue<>(10, Collections.reverseOrder());
Questo crea una PriorityQueue che può inizialmente contenere 10 interi, ordinati dal più alto al più basso.
Costruttori della Classe
PriorityQueue ha diversi costruttori. Pensate ai costruttori come a diverse ricette per creare la vostra coda. Ecco i principali:
Costruttore | Descrizione |
---|---|
PriorityQueue() |
Crea una coda vuota con la capacità iniziale predefinita (11) |
PriorityQueue(int initialCapacity) |
Crea una coda vuota con la capacità iniziale specificata |
PriorityQueue(Comparator<? super E> comparator) |
Crea una coda vuota con il comparatore specificato |
PriorityQueue(Collection<? extends E> c) |
Crea una coda contenente gli elementi nella raccolta specificata |
Vediamo un esempio:
PriorityQueue<String> fruitQueue = new PriorityQueue<>();
PriorityQueue<Integer> numberQueue = new PriorityQueue<>(20);
Nella prima riga, stiamo creando una coda per stringhe (forse nomi di frutta?). Nella seconda, stiamo creando una coda per numeri che può inizialmente contenere 20 elementi.
Metodi della Classe
Ora, vediamo alcune delle cose interessanti che puoi fare con una PriorityQueue:
Metodo | Descrizione |
---|---|
add(E e) |
Aggiunge un elemento alla coda |
offer(E e) |
Aggiunge un elemento alla coda (restituisce falso se piena) |
peek() |
Recupera, ma non rimuove, la testa della coda |
poll() |
Recupera e rimuove la testa della coda |
remove(Object o) |
Rimuove una singola istanza dell'elemento specificato |
size() |
Restituisce il numero di elementi nella coda |
clear() |
Rimuove tutti gli elementi dalla coda |
Vediamo questi in azione:
PriorityQueue<String> animalQueue = new PriorityQueue<>();
animalQueue.add("Dog");
animalQueue.offer("Cat");
animalQueue.add("Elephant");
System.out.println("Peek: " + animalQueue.peek()); // Stampa: Peek: Cat
System.out.println("Poll: " + animalQueue.poll()); // Stampa: Poll: Cat
System.out.println("Size: " + animalQueue.size()); // Stampa: Size: 2
Notate come "Cat" sia venuto per primo? Questo perché PriorityQueue ordina le stringhe alfabeticamente per default.
Metodi Ereditati
PriorityQueue eredita anche metodi dalle sue classi genitrici. È come ottenere funzionalità bonus! Alcuni utili includono:
-
contains(Object o)
: Controlla se la coda contiene l'elemento specificato -
toArray()
: Restituisce un array contenente tutti gli elementi nella coda -
iterator()
: Restituisce un iteratore sugli elementi nella coda
Ecco un breve esempio:
PriorityQueue<Integer> numberQueue = new PriorityQueue<>();
numberQueue.add(5);
numberQueue.add(2);
numberQueue.add(8);
System.out.println("Contains 2? " + numberQueue.contains(2)); // Stampa: Contains 2? true
Object[] array = numberQueue.toArray();
System.out.println("First element: " + array[0]); // Stampa: First element: 2
Esempio di Aggiunta di un Elemento a una Priority Queue
Mettiamo tutto insieme con un esempio divertente. Immaginate di organizzare una festa e voler salutare i nostri ospiti in ordine di arrivo:
import java.util.PriorityQueue;
public class PartyGreeter {
public static void main(String[] args) {
PriorityQueue<Guest> guestQueue = new PriorityQueue<>();
guestQueue.add(new Guest("Alice", 18.30));
guestQueue.add(new Guest("Bob", 18.15));
guestQueue.add(new Guest("Charlie", 18.45));
while (!guestQueue.isEmpty()) {
Guest guest = guestQueue.poll();
System.out.println("Benvenuto, " + guest.name + "! Sei arrivato alle " + guest.arrivalTime);
}
}
static class Guest implements Comparable<Guest> {
String name;
double arrivalTime;
Guest(String name, double arrivalTime) {
this.name = name;
this.arrivalTime = arrivalTime;
}
@Override
public int compareTo(Guest other) {
return Double.compare(this.arrivalTime, other.arrivalTime);
}
}
}
Questo programma restituirà:
Benvenuto, Bob! Sei arrivato alle 18.15
Benvenuto, Alice! Sei arrivato alle 18.3
Benvenuto, Charlie! Sei arrivato alle 18.45
In questo esempio, abbiamo creato una classe Guest
personalizzata e abbiamo detto a Java come confrontare i ospiti in base al loro orario di arrivo. La PriorityQueue ha quindi ordinato automaticamente i nostri ospiti!
Eccoci qui! Avete appena fatto i vostri primi passi nel mondo delle PriorityQueues in Java. Ricordate, la pratica fa il maestro, quindi non avete paura di sperimentare con questi concetti. Chi sa? Forse userete una PriorityQueue per organizzare la lista degli ospiti della vostra prossima festa!
Credits: Image by storyset