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