2016-05-26 22 views
0

私はJavaを学び、コレクションの優先度キューを学習しようとしていました。私は例の下にしようとした1つのウェブサイトから:優先度キューで優先度を設定する方法

import java.util.*;  
class S 
{ 
    public static void main(String args[]) 
    { 
     PriorityQueue<String> queue=new PriorityQueue<String>(); 
     queue.add("Amit"); 
     queue.add("Vijay"); 
     queue.add("Karan"); 
     queue.add("Rahul"); 
     queue.add("Jai"); 

     System.out.println("iterating the queue elements:"); 
     Iterator<String> itr=queue.iterator(); 
     while(itr.hasNext()) 
     { 
      System.out.println(itr.next()); 
     } 
    } 
} 

ここでの結果は来以下の通りです:

Amit 
Jai 
Karan 
Vijay 
Rahul` 

私は結果を期待していたとおり、私はどのように理解することはできませんよ

Amit 
Vijay 
Karan 
Rahul 
Jai 

結果は私の期待から変わり、どんなタイプの標準優先度またはデフォルト優先度が使用されます。
私の期待通りに同じ結果を得たい場合は、どうすればよいでしょうか?

私を助けてください。

ここでは、優先順位キューのデフォルトの順序付けの正確な原因が必要です。 PriorityQueue

+0

コンパレータを使用してデータをソートする必要があります。 – sauumum

答えて

1

引用のJavadoc:方法iterator()に設け

イテレータは、任意の特定の順序に優先度キューの要素を横断することが保証ないあります。

あなたが見ることができるようにiterator()を使用した場合、PriorityQueueの順序は重要ではありません。今すぐpoll()を使用してキューから値を取得した場合は、辞書順の値、つまりの自然順序Stringの値になります。

挿入順序でアイテムを返すキューを使用する場合は、またはArrayDequeのような通常のQueueの実装を使用します。

+0

ちょうどもう一つの事..私の質問ごとに、私はEclipseでデバッグをチェックし、キューはイテレータが表示しているのと同じ要素の順序を示しています。私は辞書編集法を理解しようとしましたが、これがデフォルトの順序付けのためにどのように挿入されたかをまだ理解できません。 –

+0

@SumitKumarAgarwal 'PriorityQueue'の場合、* ordering *(デフォルトまたはそうでない場合)は' poll() 'と' remove() 'に適用され、' iterator() 'には適用されません。 Eclipseは 'toString()'を表示に使用し、 'iterator()'を内部的に使用します。 Eclipseには 'queue'という名前のバッキング配列も示されています。これはバランスの取れたバイナリツリーのフラット表現であり、奇妙な繰り返し順序も説明しています。 – Andreas