PriorityQueue是隊列的一種,它叫做優先隊列,該類實現了Queue接口。
之所以叫做優先隊列,是因為PriorityQueue實現了Comparator這個比較接口,也就是PriorityQueue內部具有了排序方法,在offer(插入)或poll(彈出)元素的過程中,優先隊列中的數據會動態排序(而非顯式的調用排序方法,可能初學者會這麼認為)。
如果不提供Comparator的話,PriorityQueue會按默認的執行,即按照自然數排列,數字最小的優先權最高,對於字符串來說,則是按照字典序。
優先隊列不同於常規的隊列,對於常規隊列來說,每次從隊尾入隊,隊首出隊;而對於優先權隊列來說,每次出隊則是優先權最高的元素。
下面呢,讓我們以一個具體案例來更深入的理解PriorityQueue的用法。
1 public static void main(String[] args) {
2 // TODO Auto-generated method stub
3 Queue<Integer> queue=new PriorityQueue<Integer>(10,new Comparator<Integer>() {
4
5 @Override
6 public int compare(Integer i, Integer j) {
7 // TODO Auto-generated method stub
8 //注意理解,這裡是奇數在左側,數字大的在左側
9 int result=i%2-j%2;
10 if(result==0)
11 result=i-j;
12 return result;
13 }
14 });
15 for(int i=0;i<10;i++)
16 {
17 queue.offer(i);
18 }
19 for(int i=0;i<10;i++)
20 {
21 System.out.println(queue.poll());
22 }
23 }
上述代碼實現了一個比較器,該比較器設置為奇數在偶數的左側,大數在小數的左側。故輸出結果為:0 2 4 6 8 1 3 5 7 9
如果,把比較器的參數i和j互換一下,那麼,親們,能猜測到結果嗎?
參數互換以後,奇數在偶數的右側,大數在小數的右側(注意,個人感覺右側的優先權最高,即右側即為隊首,勿噴~);
public static void main(String[] args) {
// TODO Auto-generated method stub
Queue<Integer> queue=new PriorityQueue<Integer>(10,new Comparator<Integer>() {
@Override
public int compare(Integer j, Integer i) {
// TODO Auto-generated method stub
int result=i%2-j%2;
if(result==0)
result=i-j;
return result;
}
});
for(int i=0;i<10;i++)
{
queue.offer(i);
}
for(int i=0;i<10;i++)
{
System.out.println(queue.poll());
}
}
打印結果為 9 7 5 3 1 8 6 4 2 0