Pentru majoritatea oamenilor, cuvântul „coadă” aduce în minte foarte puține asocieri plăcute. Dar astăzi vorbim despre diferite cozi — cozi Java. În Java, o coadă este orice moștenește interfața Queue , care, la rândul său, extinde interfața Collection . Asta înseamnă că cozile pot fi tratate ca colecții.

Cozile în Java acceptă două principii de funcționare: FIFO și LIFO .

Principiul FIFO (First In, First Out) guvernează o coadă obișnuită - primul element adăugat în coadă este primul care o părăsește.

Principiul LIFO (Last In, First Out) descrie comportamentul unei stive - ultimul element adăugat în coadă este primul care îl părăsește. De exemplu, așa lucrezi cu un pachet de cărți: scoți cărțile din partea de sus pe rând până ajungi la partea de jos a pachetului.

Ierarhia Cozii în Java arată astfel:

Aici puteți vedea că Queue are 3 clase de implementare: LinkedList , ArrayDeque și PriorityQueue . LinkedList și ArrayDeque moștenesc direct nu Queue , ci Deque .

Deque este o interfață care a fost adăugată în Java 6. Include mai multe metode care sunt utile pentru cozi și permite unei cozi să funcționeze ca o coadă dublu (sau bidirecțională). Asta înseamnă că poate fiFIFOșiLIFO.

Unul dintre cei doi descendenți ai interfeței Deque este ArrayDeque . Acceptă o coadă cu două capete care vă permite să introduceți și să eliminați elemente de la ambele capete. Este, de asemenea, o matrice dinamică care crește automat în dimensiune.

Există, de asemenea, o clasă PriorityQueue , care este un descendent direct al Queue : se comportă diferit față de clasele care implementează Deque .

PriorityQueue este o coadă de prioritate care organizează elementele în conformitate cu ordinea lor naturală în mod implicit. Aici sortarea folosește interfețele Comparabil și Comparator . Principiul este același ca și în cazul TreeSet sau TreeMap — clase care folosesc interfața Comparable și au propria lor ordine de sortare.

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());
}

Dacă rulați acest exemplu, iată ce veți vedea în consolă:

Rob
John
Andrew

Deoarece lucrăm cu cozi și nu cu colecții obișnuite, trebuie să eliminăm elementele din listă. Pentru a face acest lucru, folosim acest construct:

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

Interfața Deque moștenește metodele Queue și adaugă câteva dintre propriile sale metode interesante:

void addFirst(E obj) Adaugă elementul obj în partea din față a cozii
void addLast(E obj) Adaugă elementul obj la sfârșitul cozii
E getFirst() Returnează primul element din coadă
E getLast() Returnează ultimul element din coadă
oferta booleanFirst(E obj) Adaugă elementul obj în partea din față a cozii și returnează true dacă elementul este adăugat. În caz contrar, returnează false .
oferta booleanLast(E obj) Adaugă elementul obj la sfârșitul cozii și returnează true dacă elementul este adăugat. În caz contrar, returnează false .
E pop() Preia primul element din coadă și îl elimină
void push(E obj) Adaugă elementul obj în partea din față a cozii
E peekFirst() Returnează (dar nu elimină) primul element din coadă
E peekLast() Returnează (dar nu elimină) ultimul element din coadă
E pollFirst() Returnează și elimină primul element din coadă. Returnează null dacă nu există elemente.
E sondajLast() Returnează și elimină ultimul element din coadă. Returnează null dacă nu există elemente.
E removeLast() Returnează și elimină primul element al cozii. Aruncă o excepție dacă nu există elemente.
E removeFirst() Returnează și elimină ultimul element al cozii. Aruncă o excepție dacă nu există elemente.
boolean removeFirstOccurrence (obiect obiect) Elimină prima apariție a obj din coadă
boolean removeLastOccurrence (obiect obiect) Elimină ultima apariție a obj din coadă

Să ne uităm acum la câteva dintre aceste metode în practică.

Mai întâi, să adăugăm un element la o coadă:

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);
[Portocale, măr, ananas]

Acum să obținem valori dintr-o coadă:

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());

    }

Acest cod afișează primul și ultimul element al cozii.

Primul element este: Portocaliu
Ultimul element este: 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);

Rulând acest cod, obținem:


Portocală de măr

[ananas, lămâie]

Diferența dintre pop() și poll() este că pop() va arunca o NoSuchElementException dacă lista este o listă goală, dar poll() va returna null .

Acum vom lua în considerare metodele pollFirst() și 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);
Portocală Lămâie
[
Mer, PineApple]

Ambele metode returnează și elimină o valoare din coadă.

Iată un exemplu de utilizare a metodelor peekFirst() și 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);
Primul element este: John
Ultimul element este: Oliver
[John, Rob, Greg, Max, Oliver]

Ambele metode returnează primul/ultimul element din coadă și nu le elimină. Dacă coada este goală, va fi returnat null .

Bine făcut! Astăzi am învățat cum să lucrăm cu cozile în Java. Acum știi cum să le folosești în practică.