优先级队列未保持排序顺序 我无法正确实施Comparable吗? 输出的排序顺序不正确?
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]
答案 0 :(得分:2)
在优先级队列中,唯一的保证就是 head 是最低的(或最大的,取决于您的比较)。内部结构不一定是排序列表。实际上,在Java中,这是一个堆:
PriorityQueue
基于优先级堆的无界优先级队列。
但是,如果循环执行poll()
第一项,则一次又一次打印,直到优先级队列为空。元素应从最小到最大打印。
答案 1 :(得分:2)
Primary队列不能保证ordering
。它使用的内部数据结构是Heap
。但是无论何时轮询,它都会按其优先级顺序返回元素。例如下面的代码:
for (int i = 0; i < 5; i++) {
System.out.print(pq.poll() + " ,");
}
为您提供输出:
1 ,5 ,8 ,9 ,19
答案 2 :(得分:1)
您没有正确实现@echo off
cd "C:\Users\C51539A\Downloads\influxdb-1.5.2-1"
start "InfluxDB" cmd /c start.cmd
...
:这是一个泛型类,因此您应该指定类型参数。我想你想要Comparable
。
Comparable<A>
这不会更改代码的输出,只会消除强制转换和警告。
此外,请勿使用减法比较整数,因为这不能处理溢出:请使用class A implements Comparable<A> {
// ...
@Override public int compare(A other) {
return i - other.i; // Cast is no longer required.
}
// ...
}
:
Integer.compare