Java學習筆記--PriorityQueue(優先隊列)(堆)


PriorityQueue(優先隊列)
實際上是一個堆(不指定Comparator時默認為最小堆)
隊列既可以根據元素的自然順序來排序,也可以根據 Comparator來設置排序規則。

隊列的頭是按指定排序方式的最小元素。如果多個元素都是最小值,則頭是其中一個元素。
新建對象的時候可以指定一個初始容量,其容量會自動增加。

注意1:該隊列是用數組實現,但是數組大小可以動態增加,容量無限。

注意2:隊列的實現不是同步的。不是線程安全的。如果多個線程中的任意線程從結構上修改了列表, 則這些線程不應同時訪問 PriorityQueue實例。保證線程安全可以使用PriorityBlockingQueue 類。

注意3:不允許使用 null 元素。

注意4:插入方法(offer()、poll()、remove() 、add() 方法)時間復雜度為O(log(n)) ;
remove(Object) 和 contains(Object) 時間復雜度為O(n);
檢索方法(peek、element 和 size)時間復雜度為常量。

注意5:方法iterator()中提供的迭代器並不保證以有序的方式遍歷優先級隊列中的元素。(原因可參考PriorityQueue的內部實現)
如果需要按順序遍歷,可用Arrays.sort(pq.toArray())

注意6:可以在構造函數中指定如何排序。如:
PriorityQueue()
          使用默認的初始容量(11)創建一個 PriorityQueue,並根據其自然順序來排序其元素(使用 Comparable)。
PriorityQueue(int initialCapacity)
          使用指定的初始容量創建一個 PriorityQueue,並根據其自然順序來排序其元素(使用 Comparable)。
PriorityQueue(int initialCapacity, Comparator<? super E> comparator)
          使用指定的初始容量創建一個 PriorityQueue,並根據指定的比較器comparator來排序其元素。

注意7:此類及其迭代器實現了 Collection 和 Iterator 接口的所有可選 方法。

PriorityQueue對元素采用的是堆排序,頭是按指定排序方式的最小元素。堆排序只能保證根是最大(最小),整個堆並不是有序的
方法iterator()中提供的迭代器可能只是對整個數組的依次遍歷。也就只能保證數組的第一個元素是最小的。

 
示例:自己指定比較器進行排序

Queue<Integer> pq = new PriorityQueue<Integer>(11,
                new Comparator<Integer>() {
                    public int compare(Integer i1, Integer i2) {
                        return i2 - i1;
                    }
                });

 
完整例子:

public class PriorityQueueTest{        
    public static void main(String args[]){  
        PriorityQueue<People> queue = new PriorityQueue<People>(11,  
                new Comparator<People>() {  
                  public int compare(People p1, People p2) {  
                    return p2.age - p1.age;  
                  }  
                });       
              
        for (int i = 1; i <= 10; i++) {  
            queue.add(new People("張"+ i, (new Random().nextInt(100))));  
        }  
        while (!queue.isEmpty()) {  
              System.out.println(queue.poll().toString());  
        }  
    }  
}  
  
class People {   
    String name;  
    int age;  
    public People(String name, int age){  
        this.name = name;  
        this.age = age;  
    }      
    public String toString() {  
        return "姓名:"+name + " 年齡:" + age;  
    }  
}  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM