Java PriorityQueue poll()值的顺序
我实现了一个Dijkstra算法,它使用PriorityQueue Q保存当前处理的节点,使用HashSet S保存已解决的节点 我试图了解优先级队列的功能和修改方式 日志:Java PriorityQueue poll()值的顺序,java,priority-queue,dijkstra,Java,Priority Queue,Dijkstra,我实现了一个Dijkstra算法,它使用PriorityQueue Q保存当前处理的节点,使用HashSet S保存已解决的节点 我试图了解优先级队列的功能和修改方式 日志:……将相邻顶点添加到q添加 到q的相邻顶点添加到q的相邻顶点 S的当前状态2:[e,d,a]Q的当前状态2:[b,b,b, c] 轮询最小顶点:bS:[e,d, a] Q:[b,c,b]的当前状态… 我不明白为什么在Q上使用轮询方法后,优先级队列上的顺序变为[b,c,b]–b的距离最小,既然它是优先级队列,它不应该是[b,b
……
将相邻顶点添加到q
添加 到q的相邻顶点添加到q的相邻顶点
S的当前状态2:[e,d,a]
Q的当前状态2:[b,b,b, c]
轮询最小顶点:b
S:[e,d, a]
Q:[b,c,b]的当前状态
…
我不明白为什么在Q上使用轮询方法后,优先级队列上的顺序变为
[b,c,b]
–b的距离最小,既然它是优先级队列,它不应该是[b,b,c]
S和Q包含我的节点对象,这就是我如何实现compareTo
方法的:
@Override
public int compareTo(Vertex o) {
//return Integer.compare(this.getDistance(), o.getDistance());
if (this.getDistance() > o.getDistance() ) return 1;
else if (this.getDistance() < o.getDistance()) return -1;
else return 0;
}
@覆盖
公共整数比较(顶点o){
//返回整数.compare(this.getDistance(),o.getDistance());
if(this.getDistance()>o.getDistance())返回1;
else if(this.getDistance()
PriorityQueue继承自AbstractCollection
,使用iterator()
方法:
迭代器不会以任何特定顺序返回元素
不要按照打印顺序阅读任何内容:这并不意味着什么特别的内容。尝试以下方法:
PriorityQueue<Object> queue = new PriorityQueue<>();
Object[] array = queue.toArray();
Arrays.sort(array);
System.out.println(Arrays.toString(array));
PriorityQueue queue=new PriorityQueue();
Object[]数组=queue.toArray();
数组。排序(数组);
System.out.println(array.toString(array));
发件人:
方法Iterator()中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用数组。排序(pq.toAlayle())。
请注意,还返回没有特定顺序的元素。对您可能的帮助是使用Arrays.sort()
,它将使用compareTo()
方法