当前位置: 首页 > 知识库问答 >
问题:

优先级队列未维护排序顺序

季稳
2023-03-14

优先级队列未维护排序顺序我是否未正确执行?输出时出现错误的排序顺序?

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]

共有3个答案

伍玮
2023-03-14

您没有正确实现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);

丁均
2023-03-14

隐修会队列不保证排序。它使用的内部数据结构是Heap。但无论何时轮询,它都会按优先级顺序返回元素。例如下面的代码:

for (int i = 0; i < 5; i++) {
    System.out.print(pq.poll() + " ,");
}

为您提供以下输出:

1 ,5 ,8 ,9 ,19 
姜淇
2023-03-14

在优先级队列中,唯一的保证是头是最低的(或最大的,取决于您的比较)。内部结构不一定是排序列表。实际上,在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]。为什么?应该自然排序吧