Java 优先级队列未维护排序顺序
优先级队列未维护排序顺序 我是否没有正确执行? 输出的排序顺序错误?Java 优先级队列未维护排序顺序,java,collections,Java,Collections,优先级队列未维护排序顺序 我是否没有正确执行? 输出的排序顺序错误? import java.util.PriorityQueue; class A implements Comparable { int i; A(int i) { this.i = i; } public int compareTo(Object obj) {
import java.util.PriorityQueue;
class A implements Comparable
{
int i;
A(int i)
{
this.i = i;
}
public int compareTo(Object obj)
{
return i - ((A)obj).i;
}
public String toString()
{
return Integer.toString(i);
}
}
class Manager11
{
public static void main(String[] args)
{
PriorityQueue pq = new PriorityQueue();
pq.add(new A(9));
pq.add(new A(5));
pq.add(new A(8));
pq.add(new A(19));
pq.add(new A(1));
System.out.println(pq);
}
}
输出:
[1,5,8,19,9]在优先级队列中,您唯一能保证的是头是最低的(或最大的,取决于您的比较)。内部结构不一定是排序列表。实际上,在Java中,它是一个堆: 优先队列 基于优先级堆的无限优先级队列
但是,如果您对第一项执行循环
poll()
,然后反复打印它,直到优先级队列为空。元素应从最低到最高打印。隐修会队列不保证排序。它使用的内部数据结构是堆
。但无论何时轮询,它都会按优先级顺序返回元素。例如下面的代码:
for (int i = 0; i < 5; i++) {
System.out.print(pq.poll() + " ,");
}
您没有正确实现
Comparable
:它是一个泛型类,因此您应该指定类型参数。我想你想要可比的
PriorityQueue.toString()
:AbstractCollection.toString
中没有这样的保证:“字符串表示法由集合元素的列表组成,这些元素按迭代器返回的顺序排列”;并且PriorityQueue
说:“迭代器()方法中提供的迭代器不能保证以任何特定顺序遍历优先级队列的元素。”。最低的元素首先出现只是一个实现细节,只有第一个条目被排序。从javadoc for PriorityQueue`中,方法迭代器()中提供的迭代器和方法拆分器()中提供的拆分器不保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用数组。排序(pq.toAlayle())。
1 ,5 ,8 ,9 ,19
class A implements Comparable<A> {
// ...
@Override public int compare(A other) {
return i - other.i; // Cast is no longer required.
}
// ...
}
return Integer.compare(i, other.i);