2

整数の順序付きリストを保持するために優先キューを使用しようとしています。このような単純な例では:

PriorityQueue<Integer> queue = new PriorityQueue<>();
queue.offer(3000);
queue.offer(1999);
queue.offer(999);
for(Integer i : queue)
    System.out.println(i);

このプリント

999
3000
1999

これは私が自然な退屈を考慮して期待していることではありません。

キュー(ソートされたリストとして機能)を削除または追加せずに、順序付けを使用して反復したいだけです。それでも簡単な方法でそれを行うことはできますか?

4

2 に答える 2

8

PriorityQueueは、ヒープと呼ばれる半順序のツリー構造を使用して、テールまたはヘッドの値をすばやく見つけるために最適化されたコレクションです(ウィキペディアで検索してください)。要素をポップすると、それらは順序付けられます。反復する場合は、代わりに、たとえば、ソートされた要素も格納するSortedSetを使用します。

于 2012-06-10T21:26:08.340 に答える
4

これはPriorityQueueの非常に卑劣な問題です:Apiを引用する

メソッドiterator()で提供されるイテレータは、特定の順序で優先キューの要素をトラバースすることが保証されていません。順序付きトラバーサルが必要な場合は、Arrays.sort(pq.toArray())の使用を検討してください。

代わりに投票を使用して、順番になる頭を取得します

于 2012-06-10T21:28:13.930 に答える