Java Priority Queue(PriorityQueue)示例
我們知道, 隊列如下:F irst- 我正?First-?UT模型,但有時我們需要處理的基礎上,優先級隊列中的對象。 例如,假設我們有一個應用程序可以為日常交易生成股票報告,并處理大量數據并花費時間來處理它。 因此,客戶正在將請求發送到實際上正在排隊的應用程序,但是我們要先處理高級客戶,然后再處理標準客戶。 因此,在這種情況下,用Java實現PriorityQueue確實很有幫助。
PriorityQueue類在Java 1.5中引入,并且是Java Collections Framework的一部分。 PriorityQueue是基于優先級堆的無界隊列,并且默認情況下優先級隊列的元素以自然順序排序,或者我們可以在隊列實例化時提供Comparator進行排序。
PriorityQueue不允許使用空值,并且我們無法創建不可比對象的PriorityQueue,例如我們擁有的任何自定義類。 我們使用java Comparable和Comparator接口對對象進行排序,而PriorityQueue使用它們對元素的優先級進行處理。
優先級隊列的頭是基于自然排序或基于比較器排序的最小元素,如果有多個具有相同排序的對象,則它可以隨機輪詢其中的任何一個。 當我們輪詢隊列時,它從隊列中返回頭對象。
PriorityQueue大小不受限制,但是我們可以在創建時指定初始容量。 當我們將元素添加到優先級隊列時,它的容量會自動增長。
PriorityQueue 不是線程安全的 ,因此Java提供了PriorityBlockingQueue類,該類實現了BlockingQueue接口以在Java多線程環境中使用。
PriorityQueue實現為入隊和出隊方法提供O(log(n))時間。 讓我們來看一個自然排序以及Comparator的PriorityQueue示例。
我們有自定義類Customer ,它不提供任何類型的排序,因此,當我們嘗試將其與PriorityQueue一起使用時,應為此提供一個比較器對象。
package com.journaldev.collections;public class Customer {private int id;private String name;public Customer(int i, String n){this.id=i;this.name=n;}public int getId() {return id;}public String getName() {return name;}}我們將使用Java隨機數生成來生成隨機的客戶對象。 對于自然排序,我將使用Integer,它也是一個Java包裝器類 。
這是我們的最終測試代碼,顯示了如何使用PriorityQueue。
package com.journaldev.collections;import java.util.Comparator; import java.util.PriorityQueue; import java.util.Queue; import java.util.Random;public class PriorityQueueExample {public static void main(String[] args) {//natural ordering example of priority queueQueue<Integer> integerPriorityQueue = new PriorityQueue<>(7);Random rand = new Random();for(int i=0;i<7;i++){integerPriorityQueue.add(new Integer(rand.nextInt(100)));}for(int i=0;i<7;i++){Integer in = integerPriorityQueue.poll();System.out.println("Processing Integer:"+in);}//PriorityQueue example with ComparatorQueue<Customer> customerPriorityQueue = new PriorityQueue<>(7, idComparator);addDataToQueue(customerPriorityQueue);pollDataFromQueue(customerPriorityQueue);}//Comparator anonymous class implementationpublic static Comparator<Customer> idComparator = new Comparator<Customer>(){@Overridepublic int compare(Customer c1, Customer c2) {return (int) (c1.getId() - c2.getId());}};//utility method to add random data to Queueprivate static void addDataToQueue(Queue<Customer> customerPriorityQueue) {Random rand = new Random();for(int i=0; i<7; i++){int id = rand.nextInt(100);customerPriorityQueue.add(new Customer(id, "Pankaj "+id));}}//utility method to poll data from queueprivate static void pollDataFromQueue(Queue<Customer> customerPriorityQueue) {while(true){Customer cust = customerPriorityQueue.poll();if(cust == null) break;System.out.println("Processing Customer with ID="+cust.getId());}}}請注意,我正在使用java匿名類來實現Comparator接口并創建基于id的比較器。
當我在測試程序上運行時,得到以下輸出:
Processing Integer:9 Processing Integer:16 Processing Integer:18 Processing Integer:25 Processing Integer:33 Processing Integer:75 Processing Integer:77 Processing Customer with ID=6 Processing Customer with ID=20 Processing Customer with ID=24 Processing Customer with ID=28 Processing Customer with ID=29 Processing Customer with ID=82 Processing Customer with ID=96從輸出中可以明顯看出,最少的元素在首位,并且被首先輪詢。 如果在創建customerPriorityQueue時不提供比較器,它將在運行時引發ClassCastException。
Exception in thread "main" java.lang.ClassCastException: com.journaldev.collections.Customer cannot be cast to java.lang.Comparableat java.util.PriorityQueue.siftUpComparable(PriorityQueue.java:633)at java.util.PriorityQueue.siftUp(PriorityQueue.java:629)at java.util.PriorityQueue.offer(PriorityQueue.java:329)at java.util.PriorityQueue.add(PriorityQueue.java:306)at com.journaldev.collections.PriorityQueueExample.addDataToQueue(PriorityQueueExample.java:45)at com.journaldev.collections.PriorityQueueExample.main(PriorityQueueExample.java:25) 參考: Java優先級隊列(PriorityQueue)示例,來自我們的JCG合作伙伴 Pankaj Kumar,位于Developer Recipes博客上。翻譯自: https://www.javacodegeeks.com/2013/07/java-priority-queue-priorityqueue-example.html
總結
以上是生活随笔為你收集整理的Java Priority Queue(PriorityQueue)示例的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: vivo Y17s 手机现身跑分库:配紫
- 下一篇: 联想ThinkPad E14/E16开启
