
Java programátor expert
ArrayDeque (Array Double-Ended Queue) je dynamická obojsmerná fronta postavená na prstencovom poli, ktorá vkladá aj odoberá prvky na oboch koncoch v konštantnom čase. V článku sa pozrieme na to, aké konštruktory ponúka, v ktorých situáciách sa po nej oplatí siahnuť a ako ju využiť pri modelovaní prioritného radu zákazníkov.
V článku sa dozvieš:
Pojem array deque označuje dvojstrannú frontu implementovanú na báze dynamického poľa. V Jave ju reprezentuje trieda ArrayDeque.
Java ArrayDeque (Array Double-Ended Queue) dátová kolekcia je implementácia (k dispozícii od Java 1.6) rozhrania Deque využívajúca prstencové (circular) dynamické pole, ktoré zdvojnásobí svoju veľkosť, keď sa naplní. Podporuje pridávanie aj odoberanie prvkov na oboch koncoch fronty v konštantnom čase O(1) a to preto, lebo si pamätá odkazy na začiatok/hlavičku poľa (head) a koniec poľa (tail).
ArrayDeque je jednou z množstva dátových štruktúr (kolekcií) na jednoduchšiu prácu s dátami. V našom seriáli si postupne predstavíme aj rôzne ďalšie dátové štruktúry. Ukážeme si, ako s nimi pracovať, aké operácie sa s nimi dajú robiť, aké sú najčastejšie používané metódy. Spomenieme výhody a nevýhody a kedy je vhodné konkrétnu dátovú štruktúru použiť.
Na rozdiel od LinkedList, ktorá tiež implementuje Deque, ArrayDeque má menšiu réžiu priestorového zápisu a je rýchlejšia v prístupe k prvkom. Implementáciu ArrayDeque možno použiť ako zásobník (LIFO – Last In First Out) alebo frontu (FIFO – First In First Out). Pole ArrayDeque nie je synchronizované. To znamená, že nie je bezpečný pre viacvláknové spracovanie. Nulové prvky sú v ArrayDeque zakázane.
Pre vytvorenie inštancie ArrayDeque máme k dispozícii niekoľko konštruktorov:
1. Prázdna ArrayDeque
Vytvorí prázdnu ArrayDeque s predvolenou kapacitou (16).
ArrayDeque()
2. ArrayDeque s definovanou počiatočnou kapacitou
Vytvorí ArrayDeque so zadanou počiatočnou kapacitou.
ArrayDeque(int numElements)
3. ArrayDeque skonštruovaná z existujúcej kolekcie
Vytvorí ArrayDeque obsahujúca prvky z existujúcej kolekcie (v poradí iterácie).
ArrayDeque(Collection<? extends E> c)
Medzi základné operácie, ktoré môžeme vykonávať s ArrayDeque, patria:
Poznámka: Dvojice vyššie uvedených metód robia to isté, rozdiel je v návratovej hodnote. Prvá uvedená metóda vyvolá v prípade neúspechu výnimku a druhá boolean hodnotu true/false.
Kompletný prehľad metód triedy ArrayDeque, nájdeš v oficiálnej dokumentácii.
ArrayDeque je ideálna v prípadoch, keď:
Teraz si ukážeme, ako s kolekciou ArrayDeque v Java prakticky pracovať. Dátová štruktúra ArrayDeque sa využíva v programoch, ktoré potrebujú pracovať s prvkami na začiatku a na konci poľa.
Na ilustráciu práce s ArrayDeque s využitím jej základných metód si naprogramujeme simuláciu fronty zákazníkov čakajúcich na kúpenie lístkov. Budeme mať obyčajných a VIP zákazníkov, obaja sa po príchode normálne zaradia na koniec radu. VIP zákazníci budú však okamžite presunutí dopredu na prioritné obslúženie. Výsledky v prehľadnej forme vypíše do konzoly.
Customer.java
public class Customer {
private final String name;
private final boolean vip;
public Customer(String name, boolean vip) {
this.name = name;
this.vip = vip;
}
public String getName() {
return name;
}
public boolean isVip() {
return vip;
}
@Override
public String toString() {
return name + (vip ? " [VIP]" : " [Regular]");
}
}
TicketQueueSimulation.java
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Random;
public class TicketQueueSimulation {
private final Deque<Customer> queue = new ArrayDeque<>();
private final Random random = new Random();
public void simulateQueue() {
// Generate 8 customers
for (int i = 1; i <= 8; i++) {
boolean isVip = random.nextBoolean(); // Randomly decide if VIP
Customer customer = new Customer("Customer " + i, isVip);
if (isVip) {
// VIP customers will be prioritized at the front
queue.addFirst(customer);
System.out.println("🎟️ New VIP arrived and prioritized: " + customer);
} else {
// Regular customers join at the end
queue.addLast(customer);
System.out.println("🎟️ New regular customer arrived: " + customer);
}
}
System.out.println("\n🏁 Queue formed:");
printQueue();
// Start serving customers
System.out.println("\n🛎️ Starting service:");
while (!queue.isEmpty()) {
Customer customer = queue.pollFirst(); // Serve from the front
System.out.println("✅ Serving: " + customer);
simulateServiceTime();
}
System.out.println("\n🎉 All customers have been served!");
}
// Simulate time taken to serve a customer
private void simulateServiceTime() {
try {
Thread.sleep(500); // 500 ms delay
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
// Display the current queue status
private void printQueue() {
if (queue.isEmpty()) {
System.out.println("🔵 The queue is empty.");
return;
}
for (Customer customer : queue) {
System.out.println("🔹 " + customer);
}
}
public static void main(String[] args) {
TicketQueueSimulation simulation = new TicketQueueSimulation();
simulation.simulateQueue();
}
}
Výstup z tohto príkladu môže vyzerať nasledovne:
Pripravili sme pre teba súbory so spomínaným príkladom vo forme kódu, ktorý si môžeš spustiť priamo v Jave. Stiahni si Java kód pre ArrayDeque tu.
Súvisiace články