Per la maggior parte delle persone, la parola "coda" fa venire in mente pochissime associazioni piacevoli. Ma oggi parliamo di code diverse: le code Java. In Java, una coda è tutto ciò che eredita l' interfaccia Queue , che a sua volta estende l'interfaccia Collection . Ciò significa che le code possono essere trattate come raccolte.

Le code in Java supportano due principi operativi: FIFO e LIFO .

Il principio FIFO (First In, First Out) governa una coda regolare: il primo elemento aggiunto alla coda è il primo a lasciarla.

Il principio LIFO (Last In, First Out) descrive il comportamento di uno stack: l'ultimo elemento aggiunto alla coda è il primo a lasciarla. Ad esempio, è così che lavori con un mazzo di carte: togli le carte dalla cima una alla volta finché non raggiungi il fondo del mazzo.

La gerarchia della coda in Java è simile a questa:

Qui puoi vedere che Queue ha 3 classi di implementazione: LinkedList , ArrayDeque e PriorityQueue . LinkedList e ArrayDeque ereditano direttamente non Queue , ma Deque .

Deque è un'interfaccia che è stata aggiunta in Java 6. Include diversi metodi utili per le code e consente a una coda di funzionare come una coda a doppia estremità (o bidirezionale). Ciò significa che può essereFIFOeLIFO.

Uno dei due discendenti dell'interfaccia Deque è ArrayDeque . Supporta una coda a doppia estremità che consente di inserire e rimuovere elementi da entrambe le estremità. È anche un array dinamico che cresce automaticamente di dimensioni.

Esiste anche una classe PriorityQueue , che è una discendente diretta di Queue : si comporta in modo diverso rispetto alle classi che implementano Deque .

PriorityQueue è una coda di priorità che organizza gli elementi in base al loro ordinamento naturale per impostazione predefinita. Qui l'ordinamento utilizza leinterfacce Comparable e Comparator . Il principio è lo stesso di TreeSet o TreeMap , classi che utilizzano l' interfaccia Comparable e hanno il proprio ordinamento.

PriorityQueue<String> priorityQueue = new PriorityQueue<>(Comparator.comparingInt(String::length));

priorityQueue.add("Andrew");
priorityQueue.add("John");
priorityQueue.add("Rob");

while (!priorityQueue.isEmpty()) {
   System.out.println(priorityQueue.remove());
}

Se esegui questo esempio, ecco cosa vedrai nella console:

Rob
Giovanni
Andrea

Poiché stiamo lavorando con code e non con raccolte regolari, dobbiamo rimuovere gli elementi dall'elenco. Per farlo usiamo questo costrutto:

while (!priorityQueue.isEmpty()) {
            System.out.println(priorityQueue.remove());
}

L' interfaccia Deque eredita i metodi Queue e aggiunge molti dei suoi metodi interessanti:

void addFirst(E obj) Aggiunge l' elemento obj all'inizio della coda
void addLast(E obj) Aggiunge l' elemento obj alla fine della coda
E getPrimo() Restituisce il primo elemento dalla coda
E getUltimo() Restituisce l'ultimo elemento dalla coda
booleano offerFirst(E obj) Aggiunge l' elemento obj all'inizio della coda e restituisce true se l'elemento viene aggiunto. In caso contrario, restituisce false .
offerta booleanaLast(E obj) Aggiunge l' elemento obj alla fine della coda e restituisce true se l'elemento viene aggiunto. In caso contrario, restituisce false .
E pop() Ottiene il primo elemento dalla coda e lo rimuove
void push(E obj) Aggiunge l' elemento obj all'inizio della coda
E peekFirst() Restituisce (ma non rimuove) il primo elemento dalla coda
E peekLast() Restituisce (ma non rimuove) l'ultimo elemento dalla coda
E sondaggioPrimo() Restituisce e rimuove il primo elemento dalla coda. Restituisce null se non ci sono elementi.
E pollUltimo() Restituisce e rimuove l'ultimo elemento dalla coda. Restituisce null se non ci sono elementi.
E rimuoviUltimo() Restituisce e rimuove il primo elemento della coda. Genera un'eccezione se non sono presenti elementi.
E rimuoviPrimo() Restituisce e rimuove l'ultimo elemento della coda. Genera un'eccezione se non sono presenti elementi.
boolean removeFirstOccurrence(Oggetto obj) Rimuove la prima occorrenza di obj dalla coda
boolean removeLastOccurrence(Oggetto obj) Rimuove l'ultima occorrenza di obj dalla coda

Diamo ora un'occhiata ad alcuni di questi metodi in pratica.

Innanzitutto, aggiungiamo un elemento a una coda:

Deque<String> deque = new ArrayDeque<>();

        deque.add("Apple"); // Adds "Apple" to the end of the queue
        deque.addFirst("Orange"); // Adds "Orange" to the front of the queue
        deque.addLast("Pineapple"); // Adds "Pineapple" to the end of the queue

        System.out.println(deque);
[Arancia, Mela, Ananas]

Ora prendiamo i valori da una coda:

Deque<String> deque = new ArrayDeque<>();

deque.add("Apple");
        deque.addFirst("Orange");
        deque.addLast("Pineapple");


        System.out.println("The first element is: "+ deque.getFirst());

        System.out.println("The last element is: " + deque.getLast());

    }

Questo codice visualizza il primo e l'ultimo elemento della coda.

Il primo elemento è: Arancione
L'ultimo elemento è: Ananas

Deque<String> deque = new ArrayDeque<>();

        deque.add("Apple");
        deque.addFirst("Orange");
        deque.addLast("Pineapple");
        deque.add("Lemon");

System.out.println(deque.pop()); // Get and remove the first element of the queue
System.out.println(deque.poll()); // Get and remove the first element of the queue

System.out.println(deque);

Eseguendo questo codice, otteniamo:


Mela Arancio

[Ananas, Limone]

La differenza tra pop() e poll() è che pop() genererà una NoSuchElementException se l'elenco è un elenco vuoto, ma poll() restituirà null .

Consideriamo ora i metodi pollFirst() e pollLast() .

Deque<String> deque = new ArrayDeque<>();

        deque.add("Apple");
        deque.addFirst("Orange");
        deque.addLast("Pineapple");
        deque.add("Lemon");

System.out.println(deque.pollFirst()); // Get and remove the first element of the queue
System.out.println(deque.pollLast()); // Get and remove the last element of the queue.
System.out.println(deque);
Arancio
Limone
[Mela, Ananas]

Entrambi i metodi restituiscono e rimuovono un valore dalla coda.

Ecco un esempio di utilizzo dei metodi peekFirst() e peekLast() :

Deque<String> friends = new ArrayDeque<>();

friends.add("John");
friends.add("Rob");
friends.add("Greg");
friends.add("Max");
friends.add("Oliver");

System.out.println("The first element is: " + friends.peekFirst());
System.out.println("The last element is: " + friends.peekLast());

System.out.println(friends);
Il primo elemento è: John
L'ultimo elemento è: Oliver
[John, Rob, Greg, Max, Oliver]

Entrambi i metodi restituiscono il primo/ultimo elemento dalla coda e non li rimuovono. Se la coda è vuota, verrà restituito null .

Ben fatto! Oggi abbiamo imparato a lavorare con le code in Java. Ora sai come usarli nella pratica.