Java PriorityQueue

V tomto kurzu se pomocí příkladů dozvíme o třídě PriorityQueue rámce kolekcí Java.

PriorityQueueTřída poskytuje funkčnost haldy datové struktury.

Implementuje rozhraní fronty.

Na rozdíl od běžných front se prvky prioritní fronty načítají v seřazeném pořadí.

Předpokládejme, že chceme načíst prvky ve vzestupném pořadí. V tomto případě bude hlava prioritní fronty nejmenším prvkem. Jakmile je tento prvek načten, další nejmenší prvek bude hlavou fronty.

Je důležité si uvědomit, že prvky prioritní fronty nemusí být tříděny. Elementy se však vždy načítají v seřazeném pořadí.

Vytváření PriorityQueue

Abychom mohli vytvořit prioritní frontu, musíme java.util.PriorityQueuebalíček importovat . Jakmile naimportujeme balíček, můžeme v Java vytvořit prioritní frontu.

 PriorityQueue numbers = new PriorityQueue(); 

Zde jsme vytvořili prioritní frontu bez jakýchkoli argumentů. V tomto případě je hlava prioritní fronty nejmenším prvkem fronty. A prvky jsou z fronty odebrány vzestupně.

Můžeme však přizpůsobit řazení prvků pomocí Comparatorrozhraní. O tom se dozvíme dále v tomto tutoriálu.

Metody PriorityQueue

PriorityQueueTřída poskytuje provádění všech metod přítomných v Queuerozhraní.

Vložit prvky do PriorityQueue

  • add()- Vloží zadaný prvek do fronty. Pokud je fronta plná, vyvolá výjimku.
  • offer()- Vloží zadaný prvek do fronty. Pokud je fronta plná, vrátí se false.

Například,

 import java.util.PriorityQueue; class Main ( public static void main(String() args) ( // Creating a priority queue PriorityQueue numbers = new PriorityQueue(); // Using the add() method numbers.add(4); numbers.add(2); System.out.println("PriorityQueue: " + numbers); // Using the offer() method numbers.offer(1); System.out.println("Updated PriorityQueue: " + numbers); ) ) 

Výstup

 PriorityQueue: (2, 4) Aktualizovaná PriorityQueue: (1, 4, 2) 

Zde jsme vytvořili prioritní frontu s názvem čísla. Vložili jsme 4 a 2 do fronty.

Přestože je 4 vloženo před 2, hlava fronty je 2. Je to proto, že hlava prioritní fronty je nejmenší prvek fronty.

Poté jsme do fronty vložili 1. Fronta je nyní přeskupena tak, aby ukládala nejmenší prvek 1 do záhlaví fronty.

Přístup k prvkům PriorityQueue

Pro přístup k prvkům z prioritní fronty můžeme použít peek()metodu. Tato metoda vrací hlavu fronty. Například,

 import java.util.PriorityQueue; class Main ( public static void main(String() args) ( // Creating a priority queue PriorityQueue numbers = new PriorityQueue(); numbers.add(4); numbers.add(2); numbers.add(1); System.out.println("PriorityQueue: " + numbers); // Using the peek() method int number = numbers.peek(); System.out.println("Accessed Element: " + number); ) ) 

Výstup

 Prioritní fronta: (1, 4, 2) Přistupovaný prvek: 1 

Odeberte prvky PriorityQueue

  • remove() - odebere zadaný prvek z fronty
  • poll() - vrátí a odebere hlavu fronty

Například,

 import java.util.PriorityQueue; class Main ( public static void main(String() args) ( // Creating a priority queue PriorityQueue numbers = new PriorityQueue(); numbers.add(4); numbers.add(2); numbers.add(1); System.out.println("PriorityQueue: " + numbers); // Using the remove() method boolean result = numbers.remove(2); System.out.println("Is the element 2 removed? " + result); // Using the poll() method int number = numbers.poll(); System.out.println("Removed Element Using poll(): " + number); ) ) 

Výstup

PriorityQueue: (1, 4, 2) Je prvek 2 odstraněn? true Odstraněný prvek pomocí poll (): 1

Iterace nad prioritní frontou

K iteraci nad prvky prioritní fronty můžeme použít iterator()metodu. Aby bylo možné použít tuto metodu, musíme java.util.Iteratorbalíček importovat . Například,

 import java.util.PriorityQueue; import java.util.Iterator; class Main ( public static void main(String() args) ( // Creating a priority queue PriorityQueue numbers = new PriorityQueue(); numbers.add(4); numbers.add(2); numbers.add(1); System.out.print("PriorityQueue using iterator(): "); //Using the iterator() method Iterator iterate = numbers.iterator(); while(iterate.hasNext()) ( System.out.print(iterate.next()); System.out.print(", "); ) ) ) 

Výstup

 PriorityQueue pomocí iterátoru (): 1, 4, 2, 

Další metody PriorityQueue

Metody Popisy
contains(element) Vyhledá prioritní frontu pro zadaný prvek. Pokud je prvek nalezen, vrátí se true, pokud ne, vrátí se false.
size() Vrátí délku prioritní fronty.
toArray() Převede prioritní frontu na pole a vrátí ji.

Porovnávač prioritních front

Ve všech výše uvedených příkladech se prvky prioritní fronty načítají v přirozeném pořadí (vzestupně). Toto objednání však můžeme upravit.

K tomu musíme vytvořit vlastní třídu komparátorů, která implementuje Comparatorrozhraní. Například,

 import java.util.PriorityQueue; import java.util.Comparator; class Main ( public static void main(String() args) ( // Creating a priority queue PriorityQueue numbers = new PriorityQueue(new CustomComparator()); numbers.add(4); numbers.add(2); numbers.add(1); numbers.add(3); System.out.print("PriorityQueue: " + numbers); ) ) class CustomComparator implements Comparator ( @Override public int compare(Integer number1, Integer number2) ( int value = number1.compareTo(number2); // elements are sorted in reverse order if (value> 0) ( return -1; ) else if (value < 0) ( return 1; ) else ( return 0; ) ) ) 

Výstup

 PriorityQueue: (4, 3, 1, 2) 

Ve výše uvedeném příkladu jsme vytvořili prioritní frontu předávající třídu CustomComparator jako argument.

Třída CustomComparator implementuje Comparatorrozhraní.

Poté compare()metodu přepíšeme . Metoda nyní způsobí, že hlava prvku bude největší číslo.

Chcete-li se dozvědět více o komparátoru, navštivte Java Comparator.

Zajímavé články...