最優先キューを利用するアルゴリズムを作成しようとしているので、グーグルを見て回るとPriorityQueueが見つかりました。しかし、それを使用するには、どのように優先順位を付けたいかを伝える必要があり、これを行う方法はコンパレータを使用することです(「Node1」の特定のデータフィールドを比較したいオブジェクト)。さらにグーグルでは、Comparatorを実装するがcompareメソッドをオーバーライドする新しいコンパレーターを作成するというアイデアを提示しました。私がしようとしているのはこれです(そしてそれの他のバリエーションも):
import Java.util.Comparator;
public class distComparator implements Comparator {
@Override
public int compare(Node1 x, Node1 y){
if(x.dist<y.dist){
return -1;
}
if(x.dist>y.dist){
return 1;
}
return 0;
}
}
コンパイラーはいくつかの理由で抗議しますが、その1つは、コンパレーター・クラス(抽象的であると言っている)をオーバーライドしていないことです。
エラー:distComparatorは抽象ではなく、Comparatorの抽象メソッドcompare(Object、Object)をオーバーライドしません
この問題を処理する「compare(object x、object y)」と言うように切り替えました。現時点では、コンパイラはxまたはyに「dist」変数が見つからないと文句を言います。これは、ObjectクラスではなくNode1クラスの一部であるため、理にかなっています。
では、これはどのように機能するのでしょうか?タイプObject
を持っているようですが、どうすれば正しい変数に転送できますか?
Comparator<Node1>
を実装する必要があります:
public class distComparator implements Comparator<Node1> {
^^^^^^^
これがなければ、Comparator<Object>
を実装していることになります。これは望みのものではありません(動作させることはできますが、面倒な価値はありません)。
Node1
にdist
というアクセス可能なメンバーが含まれている場合、質問の残りのコードは問題ありません。
Java 7を使用している場合、メソッドの本文全体を次のように置き換えることができます。
return Integer.compare(x.dist, y.dist);
(Node1.dist
のタイプに応じて、Integer
をDouble
などに置き換えます。)
ここ(JSE Comparator JavaDocページ) を見るとわかるように、Comparator
インターフェースには、このコンパレーターが設計されている型を記述する一般的な「パラメーター」があります。 PriorityQueue も同様です。
したがって、PriorityQueue<Node1>
を作成する場合、次のようにComparator<Node1>
を作成できます。
public class distComparator implements Comparator<Node1> {
@Override
public int compare(Node1 x, Node1 y){
return x.dist - y.dist;
}
}