Java PriorityQueue

Σε αυτό το σεμινάριο, θα μάθουμε για την κατηγορία PriorityQueue του πλαισίου συλλογών Java με τη βοήθεια παραδειγμάτων.

Η PriorityQueueτάξη παρέχει τη λειτουργικότητα της δομής δεδομένων σωρού.

Εφαρμόζει τη διεπαφή ουράς.

Σε αντίθεση με τις κανονικές ουρές, τα στοιχεία ουράς προτεραιότητας ανακτώνται με ταξινομημένη σειρά.

Ας υποθέσουμε ότι θέλουμε να ανακτήσουμε στοιχεία με αύξουσα σειρά. Σε αυτήν την περίπτωση, η κεφαλή της ουράς προτεραιότητας θα είναι το μικρότερο στοιχείο. Μόλις ανακτηθεί αυτό το στοιχείο, το επόμενο μικρότερο στοιχείο θα είναι το κεφάλι της ουράς.

Είναι σημαντικό να σημειωθεί ότι τα στοιχεία μιας ουράς προτεραιότητας ενδέχεται να μην ταξινομηθούν. Ωστόσο, τα στοιχεία ανακτώνται πάντα με ταξινομημένη σειρά.

Δημιουργία προτεραιότητας

Για να δημιουργήσουμε μια ουρά προτεραιότητας, πρέπει να εισαγάγουμε το java.util.PriorityQueueπακέτο. Μόλις εισαγάγουμε το πακέτο, εδώ είναι πώς μπορούμε να δημιουργήσουμε μια ουρά προτεραιότητας στην Java.

 PriorityQueue numbers = new PriorityQueue(); 

Εδώ, δημιουργήσαμε μια ουρά προτεραιότητας χωρίς ορίσματα. Σε αυτήν την περίπτωση, η κεφαλή της ουράς προτεραιότητας είναι το μικρότερο στοιχείο της ουράς. Και τα στοιχεία αφαιρούνται σε αύξουσα σειρά από την ουρά.

Ωστόσο, μπορούμε να προσαρμόσουμε τη σειρά των στοιχείων με τη βοήθεια της Comparatorδιεπαφής. Θα μάθουμε για αυτό αργότερα σε αυτό το σεμινάριο.

Μέθοδοι PriorityQueue

Η PriorityQueueτάξη παρέχει την εφαρμογή όλων των μεθόδων που υπάρχουν στη Queueδιεπαφή.

Εισαγωγή στοιχείων στο PriorityQueue

  • add()- Εισάγει το καθορισμένο στοιχείο στην ουρά. Εάν η ουρά είναι γεμάτη, ρίχνει μια εξαίρεση.
  • offer()- Εισάγει το καθορισμένο στοιχείο στην ουρά. Εάν η ουρά είναι πλήρης, επιστρέφει false.

Για παράδειγμα,

 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); ) ) 

Παραγωγή

 PriorityQueue: (2, 4) Ενημερωμένη προτεραιότηταQueue: (1, 4, 2) 

Εδώ, δημιουργήσαμε μια ουρά προτεραιότητας με όνομα. Έχουμε εισαγάγει 4 και 2 στην ουρά.

Αν και το 4 έχει εισαχθεί πριν από το 2, η κεφαλή της ουράς είναι 2. Αυτό συμβαίνει επειδή η κεφαλή της ουράς προτεραιότητας είναι το μικρότερο στοιχείο της ουράς.

Έχουμε εισάγει 1 στην ουρά. Η ουρά αναδιατάσσεται τώρα για να αποθηκεύσει το μικρότερο στοιχείο 1 στην κεφαλή της ουράς.

Πρόσβαση στα στοιχεία PriorityQueue

Για πρόσβαση σε στοιχεία από μια ουρά προτεραιότητας, μπορούμε να χρησιμοποιήσουμε τη peek()μέθοδο. Αυτή η μέθοδος επιστρέφει το κεφάλι της ουράς. Για παράδειγμα,

 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); ) ) 

Παραγωγή

 PriorityQueue: (1, 4, 2) Στοιχείο πρόσβασης: 1 

Κατάργηση στοιχείων προτεραιότητας

  • remove() - αφαιρεί το καθορισμένο στοιχείο από την ουρά
  • poll() - επιστρέφει και αφαιρεί το κεφάλι της ουράς

Για παράδειγμα,

 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); ) ) 

Παραγωγή

PriorityQueue: (1, 4, 2) Καταργήθηκε το στοιχείο 2; true Καταργήθηκε το στοιχείο Χρήση δημοσκόπησης (): 1

Επανάληψη σε προτεραιότητα

Για να επαναλάβουμε τα στοιχεία μιας ουράς προτεραιότητας, μπορούμε να χρησιμοποιήσουμε τη iterator()μέθοδο. Για να χρησιμοποιήσετε αυτήν τη μέθοδο, πρέπει να εισαγάγετε το java.util.Iteratorπακέτο. Για παράδειγμα,

 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(", "); ) ) ) 

Παραγωγή

 PriorityQueue χρησιμοποιώντας τον επαναληπτή (): 1, 4, 2, 

Άλλες μέθοδοι PriorityQueue

Μέθοδοι Περιγραφές
contains(element) Αναζητά την ουρά προτεραιότητας για το καθορισμένο στοιχείο. Εάν το στοιχείο βρεθεί, επιστρέφει true, αν όχι επιστρέφει false.
size() Επιστρέφει το μήκος της ουράς προτεραιότητας.
toArray() Μετατρέπει μια ουρά προτεραιότητας σε έναν πίνακα και την επιστρέφει.

Συγκριτής PriorityQueue

Σε όλα τα παραπάνω παραδείγματα, τα στοιχεία ουράς προτεραιότητας ανακτώνται με τη φυσική σειρά (αύξουσα σειρά). Ωστόσο, μπορούμε να προσαρμόσουμε αυτήν την παραγγελία.

Για αυτό, πρέπει να δημιουργήσουμε τη δική μας κατηγορία συγκριτών που εφαρμόζει τη Comparatorδιεπαφή. Για παράδειγμα,

 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; ) ) ) 

Παραγωγή

 Προτεραιότητα Ουρά: (4, 3, 1, 2) 

Στο παραπάνω παράδειγμα, έχουμε δημιουργήσει μια ουρά προτεραιότητας που περνά την κλάση CustomComparator ως επιχείρημα.

Η κλάση CustomComparator εφαρμόζει τη Comparatorδιεπαφή.

Στη συνέχεια παρακάμπτουμε τη compare()μέθοδο. Η μέθοδος αναγκάζει τώρα την κεφαλή του στοιχείου να είναι ο μεγαλύτερος αριθμός.

Για να μάθετε περισσότερα σχετικά με το συγκριτικό, επισκεφθείτε το Java Comparator.

ενδιαφέροντα άρθρα...