logo

Rozhraní fronty v Javě

Rozhraní Queue je přítomno v java.util balíček a prodlužuje Rozhraní sběru se používá k uchování prvků, které mají být zpracovány, v pořadí FIFO (First In First Out). Jedná se o uspořádaný seznam objektů, jehož použití je omezeno na vkládání prvků na konec seznamu a mazání prvků ze začátku seznamu (tj. FIFO nebo princip First-In-First-Out.

Queue-Deque-PriorityQueue-In-Java



Protože se jedná o rozhraní, fronta potřebuje konkrétní třídu pro deklaraci a nejběžnější třídy jsou PriorityQueue a Spojový seznam v Javě. Všimněte si, že žádná z těchto implementací není bezpečná pro vlákna. PriorityBlockingQueue je jednou z alternativních implementací, pokud je potřeba implementace bezpečná pro vlákna.

Prohlášení: Rozhraní fronty je deklarováno jako:

public interface Queue extends Collection>

Vytváření objektů fronty: Od té doby Fronta je rozhraní , nelze vytvořit objekty typu fronta. K vytvoření objektu vždy potřebujeme třídu, která tento seznam rozšiřuje. A také po zavedení Generika v Javě 1.5 je možné omezit typ objektu, který lze uložit do fronty. Tuto typově bezpečnou frontu lze definovat jako:



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

V Javě je rozhraní Queue podtypem rozhraní Collection a představuje kolekci prvků v určitém pořadí. Dodržuje princip první dovnitř, první ven (FIFO), což znamená, že prvky jsou načteny v pořadí, v jakém byly přidány do fronty.

Rozhraní fronty poskytuje několik metod pro přidávání, odebírání a kontrolu prvků ve frontě. Zde jsou některé z nejčastěji používaných metod:

add(element): Přidá prvek do zadní části fronty. Pokud je fronta plná, vyvolá výjimku.



offer(element): Přidá prvek do zadní části fronty. Pokud je fronta plná, vrátí hodnotu false.

remove(): Odebere a vrátí prvek na začátku fronty. Pokud je fronta prázdná, vyvolá výjimku.

poll(): Odebere a vrátí prvek na začátku fronty. Pokud je fronta prázdná, vrátí hodnotu null.

element(): Vrátí prvek na začátku fronty, aniž by jej odstranil. Pokud je fronta prázdná, vyvolá výjimku.

peek(): Vrátí prvek na začátek fronty, aniž by jej odstranil. Pokud je fronta prázdná, vrátí hodnotu null.

Rozhraní Queue je implementováno několika třídami v Javě, včetně LinkedList, ArrayDeque a PriorityQueue. Každá z těchto tříd poskytuje různé implementace rozhraní fronty s různými výkonnostními charakteristikami a funkcemi.

Celkově je rozhraní Queue užitečným nástrojem pro správu kolekcí prvků v určitém pořadí a je široce používáno v mnoha různých aplikacích a odvětvích.

Příklad:

Jáva


dijkstra



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ýstup

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

Příklad: Fronta

Jáva




// 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ýstup

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

Operace na rozhraní fronty

Podívejme se, jak provést několik často používaných operací ve frontě pomocí Třída prioritní fronty .

1. Přidání prvků: Abychom mohli přidat prvek do fronty, můžeme použít metoda add(). . Objednávka vložení není zachována v PriorityQueue. Prvky jsou uloženy na základě pořadí priority, které je ve výchozím nastavení vzestupné.

Příklad

Jáva

linux přejmenovat složku




// 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ýstup

[For, Geeks, Geeks]>

2. Odebrání prvků: Abychom odstranili prvek z fronty, můžeme použít metoda remove(). Pokud existuje více takových objektů, pak se první výskyt objektu odstraní. Kromě toho se k odstranění hlavy a jejímu vrácení používá také metoda poll().

Příklad

Jáva




// 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ýstup

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

3. Iterace fronty: Existuje několik způsobů, jak procházet frontou. Nejznámějším způsobem je převod fronty na pole a procházení pomocí cyklu for. Fronta má však také vestavěný iterátor, který lze použít k iteraci frontou.

Příklad

Jáva




// 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ýstup

For Geeks Geeks>

Vlastnosti fronty: Následují charakteristiky fronty:

  • Fronta se používá k vkládání prvků na konec fronty a odebírá se ze začátku fronty. Vychází z konceptu FIFO.
  • Java Queue podporuje všechny metody rozhraní kolekce včetně vkládání, mazání atd.
  • Spojový seznam , ArrayBlockingQueue a PriorityQueue jsou nejčastěji používané implementace.
  • Pokud je na BlockingQueues provedena jakákoli operace null, je vyvolána výjimka NullPointerException.
  • Fronty, které jsou dostupné v balíčku java.util, jsou neomezené fronty.
  • Fronty, které jsou dostupné v balíčku java.util.concurrent, jsou ohraničené fronty.
  • Všechny fronty kromě Deques podporují vkládání a odebírání na konci a na konci fronty. Vkládání a vyjímání nosného prvku Deques na obou koncích.

Třídy, které implementují rozhraní fronty:

1. PriorityQueue: Třída PriorityQueue, která je implementována v rámci kolekce, nám poskytuje způsob, jak zpracovat objekty na základě priority. Je známo, že fronta se řídí algoritmem First-In-First-Out, ale někdy je potřeba zpracovat prvky fronty podle priority, tehdy přichází do hry PriorityQueue. Podívejme se, jak pomocí této třídy vytvořit objekt fronty.

Příklad

Jáva




java system.out.println

// 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ýstup

10 10 15>

2. Spojový seznam: LinkedList je třída, která je implementována v rámci kolekce, která neodmyslitelně implementuje Příklad

Jáva




// 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ýstup

10 10 20>

3. PriorityBlockingQueue: Je třeba poznamenat, že obě implementace, PriorityQueue a LinkedList, nejsou bezpečné pro vlákna. PriorityBlockingQueue je jednou z alternativních implementací, pokud je potřeba implementace bezpečná pro vlákna. PriorityBlockingQueue je neomezená blokovací fronta, která používá stejná pravidla řazení jako třída PriorityQueue a zásoby blokující operace získávání.
Vzhledem k tomu, že je neomezený, přidání prvků může někdy selhat kvůli vyčerpání zdrojů, což má za následek OutOfMemoryError . Podívejme se, jak pomocí této třídy vytvořit objekt fronty.

Příklad

Jáva




// 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ýstup

10 10 15>

Metody rozhraní fronty

Rozhraní fronty dědí všechny metody přítomné v rozhraní sbírek při implementaci následujících metod:

Metoda

Popis

add(int index, prvek) Tato metoda se používá k přidání prvku do určitého indexu ve frontě. Když je předán jeden parametr, jednoduše přidá prvek na konec fronty.
addAll(int index, kolekce kolekce) Tato metoda se používá k přidání všech prvků v dané kolekci do fronty. Když je předán jeden parametr, přidá všechny prvky dané kolekce na konec fronty.
velikost() Tato metoda se používá k vrácení velikosti fronty.
Průhledná() Tato metoda se používá k odstranění všech prvků ve frontě. Odkaz na vytvořenou frontu je však stále uložen.
odstranit() Tato metoda se používá k odstranění prvku z přední části fronty.
odstranit (int index) Tato metoda odebere prvek ze zadaného indexu. Následující prvky (pokud existují) posune doleva a sníží jejich indexy o 1.
odstranit (prvek) Tato metoda se používá k odstranění a vrácení prvního výskytu daného prvku ve frontě.
get(int index) Tato metoda vrací prvky na zadaném indexu.
set(int index, prvek) Tato metoda nahradí prvky na daném indexu novým prvkem. Tato funkce vrací prvek, který byl právě nahrazen novým prvkem.
indexOf(prvek) Tato metoda vrací první výskyt daného prvku resp -1 pokud prvek není přítomen ve frontě.
lastIndexOf(prvek) Tato metoda vrací poslední výskyt daného prvku resp -1 pokud prvek není přítomen ve frontě.
rovná se (prvek) Tato metoda slouží k porovnání rovnosti daného prvku s prvky fronty.
hashCode() Tato metoda se používá k vrácení hodnoty hashcode dané fronty.
je prázdný() Tato metoda se používá ke kontrole, zda je fronta prázdná nebo ne. Vrací hodnotu true, pokud je fronta prázdná, v opačném případě vrací hodnotu false.
obsahuje (prvek) Tato metoda se používá ke kontrole, zda fronta obsahuje daný prvek či nikoliv. Pokud fronta obsahuje prvek, vrátí hodnotu true.
obsahuje vše (kolekce kolekce) Tato metoda se používá ke kontrole, zda fronta obsahuje celou kolekci prvků.
řazení (komparátor) Tato metoda se používá k řazení prvků fronty na základě daného srovnávač .
booleovské přidání (objekt) Tato metoda se používá k vložení zadaného prvku do fronty a po úspěchu vrátí hodnotu true.
booleovská nabídka (objekt) Tato metoda se používá k vložení zadaného prvku do fronty.
Object poll() Tato metoda se používá k načtení a odstranění hlavy fronty nebo vrátí hodnotu null, pokud je fronta prázdná.
Object element() Tato metoda se používá k načtení, ale neodstraní hlavu fronty.
Pohled na objekt () Tato metoda se používá k načtení, ale neodstraní hlavičku této fronty, nebo vrátí hodnotu null, pokud je tato fronta prázdná.

Výhody použití rozhraní Queue v Javě:

Uchování objednávky : Rozhraní Queue poskytuje způsob, jak ukládat a načítat prvky v určitém pořadí podle principu FIFO (first-in, first-out).

Flexibilita : Rozhraní Queue je podtypem rozhraní Collection, což znamená, že jej lze použít s mnoha různými datovými strukturami a algoritmy v závislosti na požadavcích aplikace.

Vlákno bezpečnost : Některé implementace rozhraní Queue, jako je třída java.util.concurrent.ConcurrentLinkedQueue, jsou bezpečné pro vlákna, což znamená, že k nim může přistupovat více vláken současně, aniž by docházelo ke konfliktům.

Výkon : Rozhraní Queue poskytuje efektivní implementace pro přidávání, odebírání a kontrolu prvků, což z něj činí užitečný nástroj pro správu kolekcí prvků v aplikacích kritických pro výkon.

Verilog vždy

Nevýhody použití rozhraní Queue v Javě:

Omezená funkčnost: Rozhraní Queue je navrženo speciálně pro správu kolekcí prvků v určitém pořadí, což znamená, že nemusí být vhodné pro složitější datové struktury nebo algoritmy.

Omezení velikosti: Některé implementace rozhraní Queue, jako je třída ArrayDeque, mají pevnou velikost, což znamená, že nemohou přesáhnout určitý počet prvků.

Využití paměti: V závislosti na implementaci může rozhraní Queue vyžadovat více paměti než jiné datové struktury, zejména pokud potřebuje uložit další informace o pořadí prvků.

Složitost : Pro začínající programátory může být obtížné používat a pochopit rozhraní Queue, zvláště pokud nejsou obeznámeni s principy datových struktur a algoritmů.