2013-02-06 8 views
6

愚かに聞こえるかもしれませんが、(キー、値)ペアのオブジェクトを持ち、キーに従って並べ替えると意味があります。コードで私のポイントを説明する:JavaのPriorityQueueは重複したエントリをどのようにソートするのですか?

public class Pair implements Comparable<Pair> { 
    private int value; 
    private int key; 

    public Pair(int key, int value) { 
     this.key = key; 
     this.value = value; 
    } 

    @Override 
    public int compareTo(Pair o) { 
     if (this.key > o.key) 
      return 1; 
     else if (this.key < o.key) 
      return -1; 
     return 0; 
    } 
} 

public class program { 
    public static void main(String[] args) { 
     PriorityQueue<Pair> queue = new PriorityQueue<Pair>; 
     queue.add(new Pair(1,1)); 
     queue.add(new Pair(1,2)); 
     queue.add(new Pair(1,3)); 

     Pair pair = queue.poll(); // What would be in pair? 
    } 
} 

pairには何がありますか?最初または最後に追加された要素ですか?またはそれらのいずれかを決定する可能性なし?

答えて

7

優先度つきキューAPIこのような状況のための約束を行いません:

このキューの先頭に指定された順序に関して、少なくとも要素です。複数の要素が最小値で結ばれている場合、その要素はその要素の1つです。つまり、要素は任意に破棄されます。キュー検索操作poll、remove、peek、およびelementは、キューの先頭にある要素にアクセスします。

しかし、テストは簡単です。

@Override 
public String toString() { 
    return key + " " + value; 
} 

をペアと、コメントはdownvoteが続いている方が良いと思います

1 1 
+1

唯一の正解です。 –

+1

それを正しく理解すれば、私が最初に得た価値に頼ることはできません。出力から、実際には "FIFO"のように見えます。 – Petr

+1

APIによるとできませんが、私のテストでも同じPair.keyのFIFOのような動作が見られます。 –

-3

基本的にはQueueがfirstInfirstOutデータ構造です。

PriorityQueueには、comparable -ityが順序を定義します。

あなたの場合と同様に、すべての優先度はPair()と同じです。したがって、順序の変更はありません。

先入れ先出し、キューの先頭にある要素を、削除PEEK、および要素アクセス すなわちPairs (1,1) (1,2) (1,3)

としてdocumentation

キュー取得オペレーションのポーリングごとに。

+0

を出力世論調査結果

Pair pair = queue.poll(); // What would be in pair? System.out.println(pair); 

を印刷するのtoStringを追加し、私は何も間違っ – TheWhiteRabbit

+3

回答を見ていないです正しくありません。順序は不確定です。 – EJP

関連する問題