Java优先队列

Java优先队列,java,priority-queue,Java,Priority Queue,我正在尝试实现PriorityQueue。此PriorityQueue将保存类任务的实例。这些任务实例的排列方式应确保优先级较高的实例位于队列的最前面。简言之,实例应按优先级降序排列 private static Queue<Task> testQ = new PriorityQueue<Task>(11, new TaskQueueComparator()); /*** Comparator ***/ public class

我正在尝试实现PriorityQueue。此PriorityQueue将保存类任务的实例。这些任务实例的排列方式应确保优先级较高的实例位于队列的最前面。简言之,实例应按优先级降序排列

    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。有人能告诉我我在这里犯了什么错误吗?每次我从队列中删除或添加任务时,队列应按优先级降序排列任务

    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
    }
让我知道

谢谢
Josh起初,我认为您的比较器在处理ProcessElements时可能做得不对,但看起来这是一个输入错误

这对我来说是一个3倍的回报


你的意思是.poll而不是peek吗?

起初,我认为你的比较器在ProcessElements上做的事情可能不对,但看起来这是一个输入错误

这对我来说是一个3倍的回报


您的意思是.poll而不是peek吗?

仅供参考,当您轮询队列时,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

仅供参考,在轮询队列时,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

出了什么问题?你说它应该做什么,但它在做什么?家庭作业?或者有没有理由不使用java.util.PriorityQueue?我给人的印象是OP使用的是java.util.PriorityQueue,因为否则我们需要查看add的实现,可能还需要轮询。如果他不是,我们需要看到更多的代码。我得到负1的阅读理解!另外,如果一次创建所有任务元素,然后插入,会发生什么情况?出了什么问题?你说它应该做什么,但它在做什么?家庭作业?或者有没有理由不使用java.util.PriorityQueue?我给人的印象是OP使用的是java.util.PriorityQueue,因为否则我们需要查看add的实现,可能还需要轮询。如果他不是,我们需要看到更多的代码。我得到负1的阅读理解!另外,如果一次创建所有任务元素,然后插入,会发生什么?在原始代码中用poll替换peek不应该产生相同的行为吗?peek将只返回head,即3。原来的代码只显示3,3,3。我知道。这就是为什么我问如果简单地将原始代码改为CallPoll是否也能解决问题。对不起,误读了。这不会发生,因为poll删除了该项,从而减小了队列的大小。由于他基于大小进行循环,每次迭代的大小都会改变。不,因为他将原始大小存储在一个局部变量中并使用该变量。在原始代码中用poll替换peek不应该产生相同的行为吗?peek只会返回head,即3。原来的代码只显示3,3,3。我知道。这就是为什么我问如果简单地将原始代码改为CallPoll是否也能解决问题。对不起,误读了。这不会发生,因为poll删除了该项,从而减小了队列的大小。由于他根据大小进行循环,每次迭代的大小都会改变。不,因为他将原始大小存储在局部变量中并使用它。对不起,我的不好。。应该是民意调查而不是偷看对不起我的错。。它应该是民意调查,而不是偷看。