1

PriorityQueue を実装しようとしています。この PriorityQueue は、クラス Task のインスタンスを保持します。Task のこれらのインスタンスは、より高い「優先度」を持つインスタンスがキューの先頭になるように配置する必要があります。つまり、インスタンスは優先度の高い順に並べる必要があります。

    private static Queue<Task> testQ = new PriorityQueue<Task>(11, new TaskQueueComparator());


    /*** Comparator ***/        
    public class TaskQueueComparator implements Comparator<Task> {

    public int compare(Task task1, Task task2) {
        return task2.priority - task1.priority;
        }        
    }

    /**** Task definition **/       
    public class Task {
        public int priority;
        }


    /**** Code in main() ****/

    Task pe11 = new Task();
    pe11.priority = 3;
    testQ.add(pe11);


    pe11 = new Task();
    pe11.priority = 1;
    testQ.add(pe11);


    pe11 = new Task();
    pe11.priority = 2;
    testQ.add(pe11);


    void displayQueue() {

    int size = testQ.size();

    for (int k = 0; k < size; k++)
    {
        Task p = testQ.poll();
        System.out.format("Task Priority %d \n", p.priority); // The result I am getting is  3 1 2.. I was expecting 3 2 1
    }

コメントに示されているように、これは私が期待していたように 3,2,1 ではなく 3,1,2 を出力します。誰かが私がここでやっている間違いを教えてもらえますか? タスクをキューから削除またはキューに追加するたびに、キューはタスクを優先度の高い順に並べる必要があります。

お知らせ下さい。

ありがとうジョシュ

4

2 に答える 2

3

参考までに、Queue を poll() すると、PriorityQueue は優先順位の要素のみを返します。ずっと前にそれを繰り返すのに疲れたとき、私はこれを難しい方法で見つけました。さらに、挿入時の比較のみを実行します。そのため、キュー内で優先順位が変更されると、非常に奇妙な動作が発生します。

コードを次のように変更します。

void displayQueue() {
    while (!testQ.isEmpty())
    {   
    Task p = testQ.poll(); // poll, you want to remove the head
    System.out.format("Task Priority %d \n", p.priority);
    }
}

私は得ることができました:

タスク優先度 3

タスク優先度 2

タスク優先度 1

于 2012-07-27T16:25:00.890 に答える
2

最初は、コンパレータが「ProcessElements」で正しいことをしていないのではないかと思っていましたが、それはタイプミスだったようです。

これは、そのまま「3 3 3」を返します..

peek() ではなく .poll() を意味していましたか?

于 2012-07-27T16:15:21.320 に答える