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

让我知道。

谢谢乔什

4

2 回答 2

3

仅供参考,PriorityQueue 仅在您 poll() 队列时按优先级顺序返回元素。很久以前,当我厌倦了迭代它时,我很难找到这个。此外,它仅在插入时执行比较。因此,如果您在队列中的优先级发生变化,您将获得非常奇怪的行为。

通过将您的代码更改为以下内容:

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”,原样..

您的意思是 .poll() 而不是 peek()?

于 2012-07-27T16:15:21.320 回答