web-dev-qa-db-ja.com

Java PriorityQueueを最大PQに変更

Java標準ライブラリの優先度付きキューの実装は、やや紛らわしい最小の優先度付きキューのようです。最大のものに変えるために、カスタムコンパレータオブジェクトを作成しました。

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

もっとエレガントな解決策があるのだろうかと思っていました。基本的に、ダイクストラなどを実装するために使用できる一般的な優先度付きキューは必要ありません。逆に動作するものがあることすら気づいていませんでした:/

19
Chris

JavaのCollections.reverseOrder()コンパレータを使用します。

Javaリファレンス

20
Suman Chitturi

これはCollections.reverseOrder()-を使用したコードスニペットです

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

また、コンパレータとともに優先キューの初期容量(ここでは20)を提供する必要があります。

27
cyclotrojan

エレガントとはどういう意味かわかりませんが、MaxHeap(ダイクストラで使用)のようにPQを実装したい場合は、インラインコンパレータコンストラクタを使用します。

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

シンプルなものを探していて、コンパレータを一度だけ使用したいときはいつでも、それは十分にシンプルです。

3
Crandy

既存のコンパレータがある場合は、汎用の反転コンパレータを作成できます。

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);
    }
}
0
Michael Barker