将Java PriorityQueue更改为最大PQ

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

Comparator cmp = new Comparator() { public int compare( Integer x, Integer y ) { return y - x; } }; 

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

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

Java参考

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

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

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

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

 PriorityQueue PQ= new PriorityQueue(20, new Comparator(){ public int compare(Integer o1, Integer o2){ return o2 - o1; } }); 

它很简单,我可以随时寻找简单的东西,只想使用Comparator一次。

如果您有一个现有的比较器,您可以创建一个通用的反转比较器。

 public class InverseComparator implements Comparator { private final Comparator delegate; public InverseComparator(Comparator delegate) { this.delegate = delegate; } public int compare(T x, T y) { return delegate(y, x); } }