我正在处理一个旅行商问题而且我的p-queue没有运行它只是添加了最后一项。我很想知道是否有人能帮助我找出错误。这是我的Node类(添加到队列中的节点):
import java.util.*;
public class Node implements Comparable< Node >{
//level of node
int level;
//stores path of node
ArrayList< Integer > path = new ArrayList< Integer >();
//bound of node
int bound;
/** Over-rides compareTo for priority queue handling
* @return int desired sorting value
*/
public int compareTo(Node aNode)
{
if (this.bound<aNode.bound)
{
return 1;
}
if (this.bound>aNode.bound)
{
return -1;
}
else
{
return 0;
}
}
}
这是p-queue实现:
PriorityQueue< Node > theQ = new PriorityQueue< Node >();
算法正确实现,p队列根本没有将最低边界作为头部。我甚至颠倒了compareTo上的返回,对p队列输出没有影响(告诉我队列没有排序。我浪费了几个小时试图找出它并且也问了一些同学(没有人能看出来)问题)在这里拍摄,看看是否有人知道为什么队列是这样的..
答案 0 :(得分:3)
您的代码对我来说非常好。
我怀疑你正在做的是改变单个对象的bound
值并重复添加它,给你一个完整相同对象的队列(很多引用它)当然有您设置的单个(最后)值。
public static void main(String[] args)
{
PriorityQueue< Node > theQ = new PriorityQueue< Node >();
Node n = new Node();
n.bound = 6;
theQ.add(n);
n = new Node();
n.bound = 9;
theQ.add(n);
n = new Node();
n.bound = 4;
theQ.add(n);
while ((n = theQ.poll()) != null)
System.out.println("Bound = " + n.bound);
}
输出:
界限= 9
界限= 6
Bound = 4
答案 1 :(得分:2)
确保使用PriorityQueue接口提供的方法迭代Queue,例如。 remove
从顶部弹出一个元素。在伪代码中:
for each element in some other collection
priorityQueue.add(element)
while priorityQueue is not empty
Set node to priorityQueue.remove()
Do stuff with node
如果您尝试迭代for-each循环或PriorityQueue.iterator:
迭代器提供方法 iterator()不保证 遍历优先级的元素 按任何特定顺序排队。
或者,如果您不想销毁/删除PriorityQueue中的元素以按顺序迭代,您可以使用,如文档所示,
Arrays.sort(pq.toArray())