1. 程式人生 > >Java優先隊列(PriorityQueue)示例

Java優先隊列(PriorityQueue)示例

java優先隊列(priorityqueue)示例

我們知道隊列是遵循先進先出(First-In-First-Out)模式的,但有些時候需要在隊列中基於優先級處理對象。舉個例子,比方說我們有一個每日交易時段生成股票報告的應用程序,需要處理大量數據並且花費很多處理時間。客戶向這個應用程序發送請求時,實際上就進入了隊列。我們需要首先處理優先客戶再處理普通用戶。在這種情況下,Java的PriorityQueue(優先隊列)會很有幫助。

PriorityQueue類在Java1.5中引入並作為 Java Collections Framework 的一部分。PriorityQueue是基於優先堆的一個無界隊列,這個優先隊列中的元素可以默認自然排序或者通過提供的Comparator(比較器)在隊列實例化的時排序。

優先隊列不允許空值,而且不支持non-comparable(不可比較)的對象,比如用戶自定義的類。優先隊列要求使用Java Comparable和Comparator接口給對象排序,並且在排序時會按照優先級處理其中的元素。

優先隊列的頭是基於自然排序或者Comparator排序的最小元素。如果有多個對象擁有同樣的排序,那麽就可能隨機地取其中任意一個。當我們獲取隊列時,返回隊列的頭對象。

優先隊列的大小是不受限制的,但在創建時可以指定初始大小。當我們向優先隊列增加元素的時候,隊列大小會自動增加。

PriorityQueue是非線程安全的,所以Java提供了PriorityBlockingQueue(實現BlockingQueue接口)用於Java多線程環境。

我們有一個用戶類Customer,它沒有提供任何類型的排序。當我們用它建立優先隊列時,應該為其提供一個比較器對象。

package com.test4;

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Random;

/**
* @描述 :
* @創建者 : guoxiaopeng
* @創建時間 : 2017-7-4 上午10:03:42
*/
public class PriorityQueueExample {

public static void main(String[] args) {

//優先隊列自然排序()
// PriorityQueue隊列默認使用ID排序
Queue<Integer> integerPriorityQue=new PriorityQueue<>();
Random rand=new Random();
for (int i = 7; i > 0; i--) {
integerPriorityQue.add(new Integer(i));
}

for (int i = 0; i < 7; i++) {
Integer poll = integerPriorityQue.poll();
System.out.println("processing Integer:" + poll);
}


//采用自定義的ID排序選擇器初始化隊列
Queue<Customer> customerPriorityQueue = new PriorityQueue<>(7, idComparator);

addDataToQueue(customerPriorityQueue);

pollDataFromQueue(customerPriorityQueue);


}
//匿名Comparator實現
public static Comparator<Customer> idComparator=new Comparator<Customer>() {
public int compare(Customer c1, Customer c2) {
if(c1.getId()>c2.getId()){
return -1;
}
else if(c1.getId()<c2.getId()){
return 1;
}
else return 0;
}
};
//用於往隊列增加數據的通用方法
private static void addDataToQueue(Queue<Customer> customerPriorityQueue){
Random rand=new Random();
for (int i = 0; i < 7; i++) {
int id= rand.nextInt(1000);
customerPriorityQueue.add(new Customer(id,"guoxiaopeng"+ id));
}
}
//用於從隊列取數據的通用方法
private static void pollDataFromQueue(Queue<Customer> customerpriorityQueue){
while(true){
Customer ctm=customerpriorityQueue.poll();
if(ctm==null)
break;
System.out.println("Processing customer with id ="+ctm.getId());
}
}
}

控制臺輸出如下:

processing Integer:1
processing Integer:2
processing Integer:3
processing Integer:4
processing Integer:5
processing Integer:6
processing Integer:7
Processing customer with id =843
Processing customer with id =804
Processing customer with id =775
Processing customer with id =613
Processing customer with id =557
Processing customer with id =492
Processing customer with id =111

Java優先隊列(PriorityQueue)示例