web-dev-qa-db-ja.com

追加時にPriorityQueueがソートされない

Nodeオブジェクトを追加する優先度付きキューがあり、ノードは含まれている値で並べ替える必要があります。何らかの理由で、優先度付きキューは追加時にノードを並べ替えません。誰かがこれに何か問題があるのを見ることができるか、何かガイダンスがあるなら、私はそれを感謝します。ここに簡単な例があります:

PriorityQueue<Node> PQ = new PriorityQueue<Node>();
        //for each entry create a node and add it to the PriorityQueue
        for(Entry<Character,Integer> entry : entries){
            PQ.add(new Node(entry.getKey(),entry.getValue(), true));
        }

これがノードのcompareToメソッドです。

@Override
public int compareTo(Node n) {
  if(n.frequency.intValue() > this.frequency.intValue()) return  -1;
  else if(n.frequency.intValue() == this.frequency.intValue()) return 0;
  else return 1;
}
27
Trevor Arjeski

PriorityQueueは、反復するときに特定の順序で要素を返すことを期待していると思います。ただし、PriorityQueueは、ソートされたリストではなく優先ヒープとして実装されているため、このような動作は提供しません。から javadoc

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

PriorityQueueによって提供される唯一の保証は、poll()peek()などが最小の要素を返すことです。要素の順序付けられた反復が必要な場合は、TreeSetなどの他のコレクションを使用してください。

46
axtavt

順序に従ってキューを反復する方法を探している人は、 poll または remove を使用してこれを実現できます。

_while (!queue.isEmpty())
    System.out.println(queue.poll());

while (!queue.isEmpty())
    System.out.println(queue.remove());
_

poll()remove()の唯一の違いは、が空の場合にポーリングがnullを返し、removeがNoSuchElementExceptionをスローすることです。

2
Jose Da Silva