2011-10-16 60 views
0

我想學習Java和我爲此示例 - 難倒我無法找到問題的關鍵是什麼關鍵 - 優先級隊列

public class OrderedArrayMaxPQ<Key extends Comparable<Key>> { 
    private Key[] pq;   // elements 

這是優先級隊列的例子..我從http://algs4.cs.princeton.edu/24pq/OrderedArrayMaxPQ.java.html得到它 我認爲一個優先級隊列應該有一個數據+一個優先級值。我不確定這些人是如何做到的。

public class OrderedArrayMaxPQ<Key extends Comparable<Key>> { 
    private Key[] pq;   // elements 
    private int N;    // number of elements 

    // set inititial size of heap to hold size elements 
    public OrderedArrayMaxPQ(int capacity) { 
     pq = (Key[]) (new Comparable[capacity]); 
     N = 0; 
    } 


    public boolean isEmpty() { return N == 0; } 
    public int size()  { return N;  } 
    public Key delMax()  { return pq[--N]; } 

    public void insert(Key key) { 
     int i = N-1; 
     while (i >= 0 && less(key, pq[i])) { 
      pq[i+1] = pq[i]; 
      i--; 
     } 
     pq[i+1] = key; 
     N++; 
    } 
+1

需要注意的是,如果您打算在生產環境中使用此代碼,則應該意識到陣列構建行上將存在未經檢查的轉換警告,這是不可避免的,但我會建議使用'@SuppressWarnings '註釋。另外(也可能更重要的是),'delMax()'方法無法清空不再使用的引用,這可能會阻止從隊列中刪除的密鑰被垃圾收集。 –

回答

2

優先通過其Comparable接口Key實現中實現。

在您鏈接到的示例中,它們使用String元素,所以優先級爲String的執行Comparable

如果你想實現一個數字優先級,你需要創建一個優先級隊列,你的類將執行Comparable,比較優先級字段的數值。

1

您不需要Key[],只需Comparable[]

1

像別人說的那樣,專注於可比的界面。瞭解java如何實現優先級隊列的好方法是注意String,Integer,Float和其他類實現Comparator接口的事實。

這意味着,通過對象定義,它可以與其他同類型的對象進行比較(<,>或=)。

我會建議,而不是學習的優先級隊列,你

1)向量,類樹狀簡單的Java數據結構的排序播放。 2)查看Collections API。編寫一個程序,例如,使用Collections.sort對一些不同的列表進行排序。
3)嘗試編寫一個實現Comparator接口的對象,並對這些對象的集合進行排序。