将 Java PriorityQueue 更改为 Max PQ [重复]
Posted
技术标签:
【中文标题】将 Java PriorityQueue 更改为 Max PQ [重复]【英文标题】:Changing Java PriorityQueue to a Max PQ [duplicate] 【发布时间】:2010-09-14 03:17:36 【问题描述】:Java 标准库中的优先级队列实现似乎是一个最小优先级队列,我觉得这有点令人困惑。为了把它变成一个最大值,我创建了一个自定义比较器对象。
Comparator<Integer> cmp = new Comparator<Integer>()
public int compare( Integer x, Integer y )
return y - x;
;
我想知道是否有更优雅的解决方案。本质上,我不想使用通用优先级队列来实现 Dijkstras 等。我什至没有意识到会有反向操作的优先级队列:/
【问题讨论】:
【参考方案1】:这是一个使用Collections.reverseOrder()
的代码sn-p-
PriorityQueue<Integer> maxPQ = new PriorityQueue<Integer>(20,Collections.reverseOrder());
您还需要提供优先队列的初始容量(此处为 20)以及比较器。
【讨论】:
Java 8 添加了一个只接受 Comparator (docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html) 的构造函数,因此如果您使用的是 Java 8,则不必提供初始容量。【参考方案2】:使用 Java 的 Collections.reverseOrder()
比较器。
Java Reference
【讨论】:
【参考方案3】:不确定你所说的优雅是什么意思,但是当我想要像 MaxHeap(在 Dijkstra 中使用)那样实现 PQ 时,我只使用内联比较器构造函数。
PriorityQueue<Integer> PQ= new PriorityQueue<Integer>(20, new Comparator<Integer>()
public int compare(Integer o1, Integer o2)
return o2 - o1;
);
只要我在寻找简单的东西并且只想使用比较器一次,它就足够简单了。
【讨论】:
【参考方案4】:如果您有一个现有的比较器,您可以创建一个通用的反转比较器。
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);
【讨论】:
以上是关于将 Java PriorityQueue 更改为 Max PQ [重复]的主要内容,如果未能解决你的问题,请参考以下文章