Java PriorityQueue

时间:2012-07-27 16:02:29

标签: java priority-queue

我正在尝试实现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,1,2而不是3,2,1。有人可以让我知道我在这里做了什么错吗?每次从队列中删除或添加任务时,队列都应按优先级的降序排列任务。

让我知道。

由于 约什

2 个答案:

答案 0 :(得分:3)

仅供参考,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

答案 1 :(得分:2)

起初我认为你的比较器可能没有使用“ProcessElements”做正确的事情,但看起来这是一个错字。

这样我就会返回“3 3 3”。

你的意思是.poll()而不是偷看()?