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.
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.