Rozhranie fronty v jazyku Java

Rozhranie fronty v jazyku Java

Rozhranie Queue je prítomné v java.util balík a predlžuje Rozhranie zberu sa používa na uchovávanie prvkov, ktoré sa majú spracovať, v poradí FIFO (prvý dnu, prvý von). Je to usporiadaný zoznam objektov, ktorého použitie je obmedzené na vkladanie prvkov na koniec zoznamu a mazanie prvkov zo začiatku zoznamu, (t.j. FIFO alebo princíp First-In-First-Out.

Queue-Deque-PriorityQueue-In-Java

Keďže ide o rozhranie, front potrebuje konkrétnu triedu pre deklaráciu a najbežnejšie triedy sú PriorityQueue a LinkedList v Jave. Všimnite si, že ani jedna z týchto implementácií nie je bezpečná pre vlákna. PriorityBlockingQueue je jednou z alternatívnych implementácií, ak je potrebná implementácia bezpečná pre vlákna.

Vyhlásenie: Rozhranie fronty je deklarované ako:

public interface Queue extends Collection 

Vytváranie objektov frontu: Od r Fronta je rozhranie , nemožno vytvoriť objekty typu front. Na vytvorenie objektu vždy potrebujeme triedu, ktorá rozšíri tento zoznam. A tiež po zavedení Generiká v Java 1.5 je možné obmedziť typ objektu, ktorý možno uložiť do fronty. Tento typovo bezpečný rad možno definovať ako:

// Obj is the type of the object to be stored in Queue  Queue queue = new PriorityQueue (); 

V jazyku Java je rozhranie Queue podtypom rozhrania Collection a predstavuje kolekciu prvkov v špecifickom poradí. Riadi sa princípom FIFO (first-in, first-out), čo znamená, že prvky sa získavajú v poradí, v akom boli pridané do frontu.

Rozhranie Queue poskytuje niekoľko metód na pridávanie, odstraňovanie a kontrolu prvkov vo fronte. Tu sú niektoré z najčastejšie používaných metód:

add(element): Pridá prvok do zadnej časti frontu. Ak je front plný, vyvolá výnimku.

ponuka(prvok): Pridá prvok do zadnej časti frontu. Ak je front plný, vráti hodnotu false.

remove(): Odstráni a vráti prvok na začiatku frontu. Ak je front prázdny, vyvolá výnimku.

poll(): Odstráni a vráti prvok na začiatku frontu. Ak je front prázdny, vráti hodnotu null.

element(): Vráti prvok na začiatku frontu bez jeho odstránenia. Ak je front prázdny, vyvolá výnimku.

peek(): Vráti prvok na začiatok frontu bez jeho odstránenia. Ak je front prázdny, vráti hodnotu null.

Rozhranie Queue je implementované niekoľkými triedami v jazyku Java, vrátane LinkedList, ArrayDeque a PriorityQueue. Každá z týchto tried poskytuje rôzne implementácie rozhrania frontu s rôznymi výkonnostnými charakteristikami a funkciami.

Celkovo je rozhranie Queue užitočným nástrojom na správu kolekcií prvkov v špecifickom poradí a je široko používané v mnohých rôznych aplikáciách a odvetviach.

Príklad:

Java




import> java.util.LinkedList;> import> java.util.Queue;> public> class> QueueExample {> > public> static> void> main(String[] args) {> > Queue queue => new> LinkedList();> > // add elements to the queue> > queue.add(> 'apple'> );> > queue.add(> 'banana'> );> > queue.add(> 'cherry'> );> > // print the queue> > System.out.println(> 'Queue: '> + queue);> > // remove the element at the front of the queue> > String front = queue.remove();> > System.out.println(> 'Removed element: '> + front);> > // print the updated queue> > System.out.println(> 'Queue after removal: '> + queue);> > // add another element to the queue> > queue.add(> 'date'> );> > // peek at the element at the front of the queue> > String peeked = queue.peek();> > System.out.println(> 'Peeked element: '> + peeked);> > // print the updated queue> > System.out.println(> 'Queue after peek: '> + queue);> > }> }>

Výkon

Queue: [apple, banana, cherry] Removed element: apple Queue after removal: [banana, cherry] Peeked element: banana Queue after peek: [banana, cherry, date] 

Príklad: Fronta

Java




// Java program to demonstrate a Queue> import> java.util.LinkedList;> import> java.util.Queue;> public> class> QueueExample {> > public> static> void> main(String[] args)> > {> > Queue q> > => new> LinkedList();> > // Adds elements {0, 1, 2, 3, 4} to> > // the queue> > for> (> int> i => 0> ; i <> 5> ; i++)> > q.add(i);> > // Display contents of the queue.> > System.out.println(> 'Elements of queue '> > + q);> > // To remove the head of queue.> > int> removedele = q.remove();> > System.out.println(> 'removed element-'> > + removedele);> > System.out.println(q);> > // To view the head of queue> > int> head = q.peek();> > System.out.println(> 'head of queue-'> > + head);> > // Rest all methods of collection> > // interface like size and contains> > // can be used with this> > // implementation.> > int> size = q.size();> > System.out.println(> 'Size of queue-'> > + size);> > }> }>

Výkon

Elements of queue [0, 1, 2, 3, 4] removed element-0 [1, 2, 3, 4] head of queue-1 Size of queue-4 

Operácie na rozhraní fronty

Pozrime sa, ako vykonať niekoľko často používaných operácií vo fronte pomocou Trieda prioritného frontu .

1. Pridanie prvkov: Na pridanie prvku do frontu môžeme použiť metóda add(). . Objednávka vloženia sa neuchová v PriorityQueue. Prvky sú uložené na základe poradia priorít, ktoré je štandardne vzostupné.

Príklad

Java




// Java program to add elements> // to a Queue> import> java.util.*;> public> class> GFG {> > public> static> void> main(String args[])> > {> > Queue pq => new> PriorityQueue();> > pq.add(> 'Geeks'> );> > pq.add(> 'For'> );> > pq.add(> 'Geeks'> );> > System.out.println(pq);> > }> }>

Výkon

[For, Geeks, Geeks] 

2. Odstránenie prvkov: Na odstránenie prvku z frontu môžeme použiť metódu remove(). Ak existuje viacero takýchto objektov, potom sa prvý výskyt objektu odstráni. Okrem toho sa na odstránenie hlavy a jej vrátenie používa aj metóda poll().

Príklad

Java




// Java program to remove elements> // from a Queue> import> java.util.*;> public> class> GFG {> > public> static> void> main(String args[])> > {> > Queue pq => new> PriorityQueue();> > pq.add(> 'Geeks'> );> > pq.add(> 'For'> );> > pq.add(> 'Geeks'> );> > System.out.println(> 'Initial Queue '> + pq);> > pq.remove(> 'Geeks'> );> > System.out.println(> 'After Remove '> + pq);> > System.out.println(> 'Poll Method '> + pq.poll());> > System.out.println(> 'Final Queue '> + pq);> > }> }>

Výkon

Initial Queue [For, Geeks, Geeks] After Remove [For, Geeks] Poll Method For Final Queue [Geeks] 

3. Opakovanie frontu: Existuje niekoľko spôsobov, ako iterovať cez front. Najznámejším spôsobom je konverzia frontu na pole a prechádzanie pomocou cyklu for. Avšak front má tiež zabudovaný iterátor, ktorý možno použiť na iteráciu cez front.

Príklad

Java




// Java program to iterate elements> // to a Queue> import> java.util.*;> public> class> GFG {> > public> static> void> main(String args[])> > {> > Queue pq => new> PriorityQueue();> > pq.add(> 'Geeks'> );> > pq.add(> 'For'> );> > pq.add(> 'Geeks'> );> > Iterator iterator = pq.iterator();> > while> (iterator.hasNext()) {> > System.out.print(iterator.next() +> ' '> );> > }> > }> }>

Výkon

For Geeks Geeks 

Charakteristika fronty: Nasledujúce sú charakteristiky frontu:

  • Front sa používa na vkladanie prvkov na koniec frontu a na odstránenie zo začiatku frontu. Vychádza z konceptu FIFO.
  • Java Queue podporuje všetky metódy rozhrania kolekcie vrátane vkladania, vymazávania atď.
  • LinkedList , ArrayBlockingQueue a PriorityQueue sú najčastejšie používané implementácie.
  • Ak sa na BlockingQueues vykoná akákoľvek operácia null, vyvolá sa výnimka NullPointerException.
  • Fronty, ktoré sú dostupné v balíku java.util, sú neobmedzené fronty.
  • Fronty, ktoré sú dostupné v balíku java.util.concurrent, sú ohraničené fronty.
  • Všetky fronty okrem Deques podporujú vkladanie a odstraňovanie na konci a na konci frontu. Vkladanie a vyberanie podporného prvku Deques na oboch koncoch.

Triedy, ktoré implementujú rozhranie fronty:

1. PriorityQueue: Trieda PriorityQueue, ktorá je implementovaná v rámci kolekcie, nám poskytuje spôsob, ako spracovať objekty na základe priority. Je známe, že front sa riadi algoritmom First-In-First-Out, ale niekedy je potrebné spracovať prvky frontu podľa priority, vtedy prichádza do hry PriorityQueue. Pozrime sa, ako pomocou tejto triedy vytvoriť objekt frontu.

Príklad

Java




// Java program to demonstrate the> // creation of queue object using the> // PriorityQueue class> import> java.util.*;> class> GfG {> > public> static> void> main(String args[])> > {> > // Creating empty priority queue> > Queue pQueue> > => new> PriorityQueue();> > // Adding items to the pQueue> > // using add()> > pQueue.add(> 10> );> > pQueue.add(> 20> );> > pQueue.add(> 15> );> > // Printing the top element of> > // the PriorityQueue> > System.out.println(pQueue.peek());> > // Printing the top element and removing it> > // from the PriorityQueue container> > System.out.println(pQueue.poll());> > // Printing the top element again> > System.out.println(pQueue.peek());> > }> }>

Výkon

10 10 15 

2. Prepojený zoznam: LinkedList je trieda, ktorá je implementovaná v rámci kolekcie, ktorá vo svojej podstate implementuje Príklad

Java




// Java program to demonstrate the> // creation of queue object using the> // LinkedList class> import> java.util.*;> class> GfG {> > public> static> void> main(String args[])> > {> > // Creating empty LinkedList> > Queue ll> > => new> LinkedList();> > // Adding items to the ll> > // using add()> > ll.add(> 10> );> > ll.add(> 20> );> > ll.add(> 15> );> > // Printing the top element of> > // the LinkedList> > System.out.println(ll.peek());> > // Printing the top element and removing it> > // from the LinkedList container> > System.out.println(ll.poll());> > // Printing the top element again> > System.out.println(ll.peek());> > }> }>

Výkon

10 10 20 

3. PriorityBlockingQueue: Je potrebné poznamenať, že obe implementácie, PriorityQueue a LinkedList, nie sú bezpečné pre vlákna. PriorityBlockingQueue je jednou z alternatívnych implementácií, ak je potrebná implementácia bezpečná pre vlákna. PriorityBlockingQueue je neobmedzený blokovací front, ktorý používa rovnaké pravidlá zoradenia ako trieda PriorityQueue a spotrebný materiál blokujúci operácie získavania.
Keďže je neobmedzený, pridávanie prvkov môže niekedy zlyhať v dôsledku vyčerpania zdrojov OutOfMemoryError . Pozrime sa, ako pomocou tejto triedy vytvoriť objekt frontu.

Príklad

Java




// Java program to demonstrate the> // creation of queue object using the> // PriorityBlockingQueue class> import> java.util.concurrent.PriorityBlockingQueue;> import> java.util.*;> class> GfG {> > public> static> void> main(String args[])> > {> > // Creating empty priority> > // blocking queue> > Queue pbq> > => new> PriorityBlockingQueue();> > // Adding items to the pbq> > // using add()> > pbq.add(> 10> );> > pbq.add(> 20> );> > pbq.add(> 15> );> > // Printing the top element of> > // the PriorityBlockingQueue> > System.out.println(pbq.peek());> > // Printing the top element and> > // removing it from the> > // PriorityBlockingQueue> > System.out.println(pbq.poll());> > // Printing the top element again> > System.out.println(pbq.peek());> > }> }>

Výkon

10 10 15 

Metódy rozhrania frontu

Rozhranie frontu zdedí všetky metódy prítomné v rozhranie kolekcií pri implementácii nasledujúcich metód:

Metóda

Popis

pridať(int index, prvok) Táto metóda sa používa na pridanie prvku do konkrétneho indexu vo fronte. Keď sa odovzdá jeden parameter, jednoducho pridá prvok na koniec frontu.
addAll(int index, kolekcia kolekcie) Táto metóda sa používa na pridanie všetkých prvkov v danej kolekcii do frontu. Keď sa odovzdá jeden parameter, pridá všetky prvky danej kolekcie na koniec frontu.
veľkosť () Táto metóda sa používa na vrátenie veľkosti frontu.
jasný() Táto metóda sa používa na odstránenie všetkých prvkov vo fronte. Referencia vytvoreného frontu je však stále uložená.
odstrániť () Táto metóda sa používa na odstránenie prvku z prednej časti frontu.
odstrániť (int index) Táto metóda odstráni prvok zo zadaného indexu. Posúva nasledujúce prvky (ak existujú) doľava a znižuje ich indexy o 1.
odstrániť (prvok) Táto metóda sa používa na odstránenie a vrátenie prvého výskytu daného prvku vo fronte.
získať (int index) Táto metóda vráti prvky na zadanom indexe.
set(int index, prvok) Táto metóda nahrádza prvky v danom indexe novým prvkom. Táto funkcia vráti prvok, ktorý bol práve nahradený novým prvkom.
indexOf(prvku) Táto metóda vráti prvý výskyt daného prvku resp -1 ak prvok nie je prítomný vo fronte.
lastIndexOf(prvok) Táto metóda vráti posledný výskyt daného prvku resp -1 ak prvok nie je prítomný vo fronte.
rovná sa (prvok) Táto metóda sa používa na porovnanie rovnosti daného prvku s prvkami frontu.
hashCode() Táto metóda sa používa na vrátenie hodnoty hashcode daného frontu.
je prázdny() Táto metóda sa používa na kontrolu, či je front prázdny alebo nie. Ak je front prázdny, vráti hodnotu true, inak hodnotu false.
obsahuje (prvok) Táto metóda sa používa na kontrolu, či fronta obsahuje daný prvok alebo nie. Ak front obsahuje prvok, vráti hodnotu true.
obsahuje všetko (kolekcia kolekcie) Táto metóda sa používa na kontrolu, či fronta obsahuje celú kolekciu prvkov.
zoradiť (komparátor) Táto metóda sa používa na triedenie prvkov frontu na základe daného komparátor .
boolovské pridanie (objekt) Táto metóda sa používa na vloženie určeného prvku do frontu a po úspechu vráti hodnotu true.
boolovská ponuka (objekt) Táto metóda sa používa na vloženie určeného prvku do frontu.
Object poll() Táto metóda sa používa na získanie a odstránenie hlavy frontu alebo vráti hodnotu null, ak je front prázdny.
Element objektu() Táto metóda sa používa na získanie, ale neodstráni, hlavu frontu.
Pohľad na objekt () Táto metóda sa používa na získanie, ale neodstráni hlavičku tohto frontu, alebo vráti hodnotu null, ak je tento front prázdny.

Výhody použitia rozhrania Queue v jazyku Java:

Zachovanie objednávky : Rozhranie Queue poskytuje spôsob ukladania a získavania prvkov v špecifickom poradí podľa princípu FIFO (first-in, first-out).

Flexibilita : Rozhranie Queue je podtypom rozhrania Collection, čo znamená, že môže byť použité s mnohými rôznymi dátovými štruktúrami a algoritmami v závislosti od požiadaviek aplikácie.

Niť bezpečnosť : Niektoré implementácie rozhrania Queue, ako napríklad trieda java.util.concurrent.ConcurrentLinkedQueue, sú bezpečné pre vlákna, čo znamená, že k nim môžu pristupovať viaceré vlákna súčasne bez toho, aby spôsobovali konflikty.

Výkon : Rozhranie Queue poskytuje efektívne implementácie na pridávanie, odstraňovanie a kontrolu prvkov, vďaka čomu je užitočným nástrojom na správu kolekcií prvkov v aplikáciách kritických pre výkon.

Nevýhody používania rozhrania Queue v jazyku Java:

Obmedzená funkčnosť: Rozhranie Queue je navrhnuté špeciálne na správu kolekcií prvkov v určitom poradí, čo znamená, že nemusí byť vhodné pre zložitejšie dátové štruktúry alebo algoritmy.

Obmedzenia veľkosti: Niektoré implementácie rozhrania Queue, ako napríklad trieda ArrayDeque, majú pevnú veľkosť, čo znamená, že nemôžu presiahnuť určitý počet prvkov.

Využitie pamäte: V závislosti od implementácie môže rozhranie Queue vyžadovať viac pamäte ako iné dátové štruktúry, najmä ak potrebuje uložiť ďalšie informácie o poradí prvkov.

Zložitosť : Rozhranie Queue môže byť pre začínajúcich programátorov náročné na používanie a pochopenie, najmä ak nie sú oboznámení s princípmi dátových štruktúr a algoritmov.