将Java PriorityQueue更改为最大PQ

将Java PriorityQueue更改为最大PQ,java,priority-queue,standard-library,Java,Priority Queue,Standard Library,Java标准库中的优先级队列实现似乎是一个最小优先级队列,我觉得有点混乱。为了将其转换为max-one,我创建了一个定制的comparator对象 Comparator<Integer> cmp = new Comparator<Integer>() { public int compare( Integer x, Integer y ) { return y - x; } }; 比较器cmp=新比较器() { 公共整数比较(整数

Java标准库中的优先级队列实现似乎是一个最小优先级队列,我觉得有点混乱。为了将其转换为max-one,我创建了一个定制的comparator对象

Comparator<Integer> cmp = new Comparator<Integer>()
{
    public int compare( Integer x, Integer y )
    {
        return y - x;
    }
};
比较器cmp=新比较器() { 公共整数比较(整数x,整数y) { 返回y-x; } };
我想知道是否有更优雅的解决方案。基本上,我不希望有一个通用的优先级队列可以用来实现Dijkstras等。我甚至没有意识到会有一个优先级队列以相反的方式运行://

如果你有一个现有的比较器,你可以创建一个通用的反向比较器

public class InverseComparator<T> implements Comparator<T> {
    private final Comparator<T> delegate;

    public InverseComparator(Comparator<T> delegate) {
        this.delegate = delegate;
    }

    public int compare(T x, T y) {
        return delegate(y, x);
    }
}
公共类InverseComparator实现比较器{
非公开最终比较国代表;
公共反向比较程序(比较程序代表){
this.delegate=委托;
}
公共整数比较(TX,TY){
返回委托(y,x);
}
}

使用Java的
集合.reverseOrder()
比较器


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

PriorityQueue<Integer> PQ= new PriorityQueue<Integer>(20, new Comparator<Integer>(){
            public int compare(Integer o1, Integer o2){
                return o2 - o1;
            }
        });
PriorityQueue PQ=新的PriorityQueue(20,新的比较器(){
公共整数比较(整数o1,整数o2){
返回o2-o1;
}
});

它足够简单,可以在任何时候我寻找简单的东西,只想使用一次比较器。

这里是一个使用集合的代码片段。reverseOrder()-

PriorityQueue maxPQ=newpriorityqueue(20,Collections.reverseOrder());

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

Java8添加了一个只接受比较器()的构造函数,因此如果您使用Java8,则不必提供初始容量。
    PriorityQueue<Integer> maxPQ = new PriorityQueue<Integer>(20,Collections.reverseOrder());