2012-07-27 60 views
1

我想实现PriorityQueue。这个PriorityQueue将持有类Task的实例。 Task的这些实例应该以这样一种方式排列,即具有较高“优先级”的实例位于Queue的头部。总之,实例应该按照优先级降序排列。Java的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我期待。有人能让我知道我在这里做了什么错误吗?每次我从队列中删除或添加任务时,队列都应按优先级降序排列任务。

让我知道。

感谢 乔希

+0

什么会出错?你说过它应该做什么,但是它在做什么? – corsiKa 2012-07-27 16:06:04

+1

作业?或者有没有理由不使用java.util.PriorityQueue? – 2012-07-27 16:18:59

+0

他们给我的印象是OP *为*使用java.util.PriorityQueue中,因为否则的话我们就需要看到添加的实现()(也许轮询())。如果他不是,我们需要看到更多的代码。 – 2012-07-27 16:23:49

回答

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

+0

不应该在原始代码中用'poll'替换'peek'产生相同的行为? – 2012-07-27 16:29:39

+0

偷看将只返回头,这是3原代码只显示3,3,3 – Jyro117 2012-07-27 16:31:24

+0

我知道。这就是为什么我问是否简单地改变原始代码来调用'poll'而不是修复问题。 – 2012-07-27 16:32:18

2

起初我还以为你比较可能无法与“ProcessElements”做正确的事,但它看起来就像是一个错字。

这将返回 “3 3 3” 对我来说,因为是..

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

+0

对不起我的坏..它应该是民意测验,而不是偷看。 – Josh 2012-07-27 16:37:02