将 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将测试 XML 响应更改为 Bean 响应 Java

将 Java 类更改为存储过程

Java,如何将当前数据库更改为另一个?

如何将对象更改为指向java [关闭]

Java 将实例类型更改为已创建的类类型

java 将Map值更改为其他类型。 Java Stream作为地图收集。