22

Java 標準ライブラリのプライオリティ キューの実装は、少しわかりにくい最小プライオリティ キューのようです。それを最大のものに変えるために、カスタムコンパレータオブジェクトを作成しました。

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

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

4

4 に答える 4

35

を使用したコード スニペットを次に示しますCollections.reverseOrder()

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

また、Comparator と一緒に Priority Queue (ここでは 20) の初期容量を提供する必要があります。

于 2012-09-30T22:47:57.820 に答える
24

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

Java リファレンス

于 2011-12-01T22:15:17.177 に答える
6

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

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

シンプルなものを探していて、 Comparator を一度だけ使用したいときはいつでも十分にシンプルです。

于 2012-04-02T04:57:27.460 に答える
0

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

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);
    }
}
于 2010-09-14T10:33:38.523 に答える