web-dev-qa-db-ja.com

Java Comparatorの実装

最優先キューを利用するアルゴリズムを作成しようとしているので、グーグルを見て回ると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を持っているようですが、どうすれば正しい変数に転送できますか?

15
Jo.P

Comparator<Node1>を実装する必要があります:

public class distComparator implements Comparator<Node1> {
                                                 ^^^^^^^

これがなければ、Comparator<Object>を実装していることになります。これは望みのものではありません(動作させることはできますが、面倒な価値はありません)。

Node1distというアクセス可能なメンバーが含まれている場合、質問の残りのコードは問題ありません。

Java 7を使用している場合、メソッドの本文全体を次のように置き換えることができます。

return Integer.compare(x.dist, y.dist);

Node1.distのタイプに応じて、IntegerDoubleなどに置き換えます。)

17
NPE

ここ(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;
    }
}
3
vptheron