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