优先级队列未维护排序顺序我是否未正确执行?输出时出现错误的排序顺序?
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]
您没有正确实现Comparable
:它是一个泛型类,因此您应该指定类型参数。我想你想要可比的
class A implements Comparable<A> {
// ...
@Override public int compare(A other) {
return i - other.i; // Cast is no longer required.
}
// ...
}
这不会改变代码的输出,只会消除强制转换和警告。
此外,不要使用减法比较int,因为这不会处理溢出:使用
Integer.compare
:
return Integer.compare(i, other.i);
隐修会队列不保证排序
。它使用的内部数据结构是Heap
。但无论何时轮询,它都会按优先级顺序返回元素。例如下面的代码:
for (int i = 0; i < 5; i++) {
System.out.print(pq.poll() + " ,");
}
为您提供以下输出:
1 ,5 ,8 ,9 ,19
在优先级队列中,唯一的保证是头是最低的(或最大的,取决于您的比较)。内部结构不一定是排序列表。实际上,在Java,它是一堆:
优先队列
基于优先级堆的无限优先级队列。
但是,如果执行轮询()
第一项的循环,则将其重复打印,直到优先级队列为空。元素应该从最低到最大的元素打印。
我有一个,名为,其中包含类型的对象。 您可以在所有车辆上调用该方法。 我要做的是排序,这样车辆被赋予更高的优先级,并被放在队列的前面。 我假设我必须在这里使用一个比较器,但不知道怎么做。
我创建了一个名为Element的新o类对象,它有很多值“degree” 我想创建一个包含以下元素的优先级队列: 程序将打印: 但我想: 所以我想做的是,度值越大的元素优先级越高,被优先考虑。第二个问题是:如果两个元素具有相同的度值,那么它们将按哪个顺序取?
我正在编写一个最小优先级队列和一个最大优先级队列,如下所示: 输入数组的数字将一个接一个地添加到队列中。然而,当数组[12,4,5,3,8,7]是一个样本输入,打印优先队列的输出是: MIN:[3.0, 4.0, 5.0, 12.0, 8.0, 7.0]MAX:[12.0, 8.0, 7.0, 3.0, 4.0, 5.0] 我定义的比较器有什么问题吗?提前感谢你的帮助。
我写了一个迷宫求解程序,该程序应该支持DFS、BFS、a*、Dijkstra和贪婪算法。无论如何,我选择PriorityQueue作为我的frontier数据结构,因为我认为优先级可以表现为队列、堆栈或优先级队列,这取决于比较器的实现。 这就是我如何实现比较器以将优先级队列转换为队列: /由于优先级队列的“自然排序”在队列的头部具有最小的元素,并且当第一个元素小于第二个元素时,传统比较器返回-1,
问题内容: 我编写了一个迷宫求解程序,该程序应该支持DFS,BFS,A *,Dijkstra和贪婪算法。无论如何,我选择了PriorityQueue作为我的边界数据结构,因为我认为优先级的行为就像队列,堆栈或优先级队列一样,取决于比较器的实现。 这是我实现比较器以将优先级队列转换为队列的方式: / 由于优先级队列的“自然排序”元素最少,并且常规比较器在第一个小于第二个时返回-1,因此被黑的比较器始
问题内容: 默认情况下,优先级队列的元素如何按照自然顺序排序,因为它没有实现可比的接口。 从文档中可以看出,元素是根据自然顺序进行排序的,但是我找不到任何关于equals方法或可比性的东西。它在内部如何发生? 所有实现的接口:可序列化,可迭代,集合,队列。 如果它实现可比性,那么为什么不在上一行说 例: 第三条打印语句也将打印[1、3、2、4],而不是打印[1、2、3、4]。为什么?应该自然排序吧