将Java PriorityQueue更改为Max PQ

Chr*_*ris 19 java priority-queue standard-library

Java标准库中的Priority Queue实现似乎是最小优先级队列,我发现有些令人困惑.为了将其变为最大值,我创建了一个自定义比较器对象.

Comparator<Integer> cmp = new Comparator<Integer>()
{
    public int compare( Integer x, Integer y )
    {
        return y - x;
    }
};
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更优雅的解决方案.基本上我不是一个可用于实现Dijkstras等的通用优先级队列.我甚至没有意识到会有反向操作的那些:/

cyc*_*jan 27

这是一个使用的代码片段Collections.reverseOrder()-

    PriorityQueue<Integer> maxPQ = new PriorityQueue<Integer>(20,Collections.reverseOrder());
Run Code Online (Sandbox Code Playgroud)

您还需要提供优先级队列的初始容量(此处为20)以及比较器.

  • Java 8添加了一个构造函数,只需一个Comparator(https://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html),所以如果你使用的是Java 8,那么你就不会必须提供初始能力. (4认同)

小智 21

使用Java的Collections.reverseOrder()比较器.

Java参考


小智 6

不确定您所说的优雅是什么意思,但是当我想要像 MaxHeap(在 Dijkstra 中使用的)一样实现 PQ 时,我只使用内联比较器构造函数。

PriorityQueue<Integer> PQ= new PriorityQueue<Integer>(20, new Comparator<Integer>(){
            public int compare(Integer o1, Integer o2){
                return o2 - o1;
            }
        });
Run Code Online (Sandbox Code Playgroud)

它足够简单,我正在寻找简单的东西并且只想使用一次比较器。