14

これが試行錯誤の質問である場合は申し訳ありませんが、私はそれを理解するのに少し苦労しています.

現在、ノード クラスがあり、各「ノード」は迷路内の正方形です。私は A* アルゴリズムを実装しようとしているので、これらのノードのそれぞれに f-cost (int) データ メンバーが含まれます。これらのノードのプライオリティ キューを作成し、f-cost 変数をコンパレータとして設定する方法があるかどうか疑問に思っていました。

オンラインで例を見てきましたが、見つけることができるのは文字列優先キューだけです。Node クラスに Comparator を実装できますか? これにより、内部に格納されているデータ メンバーにアクセスできますか?

どうもありがとう!

4

5 に答える 5

27

絶対。

コンストラクターに渡さPriorityQueueれた匿名に基づいて使用できます。Comparator

int initCapacity = 10;
PriorityQueue<Node> pq = new PriorityQueue<Node>(initCapacity, new Comparator<Node>() {
    public int compare(Node n1, Node n2) {
        // compare n1 and n2
    }
});
// use pq as you would use any PriorityQueue

Nodeクラスがすでに実装している場合は、デフォルトでその順序が使用されるためComparable、 new を定義する必要さえありません。Comparator他の方法を除いて、オブジェクト間の自然順序付けが使用されます。

于 2010-03-31T18:09:23.277 に答える
1

Javadoc から:

プライオリティ ヒープに基づく無制限のプライオリティ キュー。このキューは、構成時に指定された順序に従って要素を並べ替えます。これは、自然順序 (Comparable を参照) または Comparator に従って指定されます。

さらに、PriorityQueues は一般的なデータ型をサポートします。したがって、ComparableNode クラスに実装するPriorityQueue<Node>と、 を作成して通常どおり使用できます。

あるいは、コンストラクターPriorityQueue(int initialCapacity, Comparator<? super E> comparator)の一部として Comparator を受け取るコンストラクターがありPriorityQueueます。この方法を使用する場合は、継承時に必要な追加のコードをノード クラスに含める必要はありませんComparable

于 2010-03-31T18:07:28.213 に答える
1
public class Node implements Comparable<Node>{

    public int compareTo(Node o) {
         // your comparative function
         return 0;
    }

}

compareTo が負の int を返す場合、それは「より小さい」を意味し、0 は「等しい」を意味し、1 は「より大きい」を意味します。

PriorityQueue を使用できるようにするために必要なのは、その 1 つの関数だけです。

編集:比較は別の方法です、私はそれを台無しにしました。-1 < | 0 = | 1 > 何らかの理由で右から左に読んでいます。

于 2010-03-31T18:12:53.393 に答える
0

java.util に PriorityQueue クラスがあります。それを使用することができ、自然順序付け (Node は Comparable を実装) またはコンストラクターで提供されるコンパレーター (Node クラス内にそのコードが必要ない場合) のいずれかを使用します。フィールドを非プライベートにするか (潜在的に悪い OOP スタイル)、アクセサ メソッド public int getG()、public int getH()、public int getF() を提供することによって許可する限り、任意のクラスは別のクラス内の任意のデータにアクセスできます。 .

于 2010-03-31T18:09:03.637 に答える