Java PriorityQueue poll()值的顺序

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

我实现了一个Dijkstra算法,它使用PriorityQueue Q保存当前处理的节点,使用HashSet S保存已解决的节点

我试图了解优先级队列的功能和修改方式

日志:
……
将相邻顶点添加到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()
方法