16

最小優先度キューを利用するアルゴリズムを作成しようとしているので、Google で調べたところ、PriorityQueue が見つかりました。ただし、それを使用するには、どのように優先順位を付けたいかを伝える必要があり、これを行うにはコンパレータを使用する必要があるようです (「Node1」の特定のデータ フィールドを比較したい)オブジェクト)。より多くのグーグルは、 Comparator を実装するが比較メソッドをオーバーライドする新しいコンパレータを作成するというアイデアを提示しました。私がしようとしているのはこれです(そしてそれの他のバリエーションも):

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) をオーバーライドしません

その問題を処理する「比較(オブジェクトx、オブジェクトy)」と言うように切り替えました。この時点で、コンパイラは x または y に「dist」変数が見つからないと文句を言いますが、これらは Object クラスではなく Node1 クラスの一部であるため、これは理にかなっています。

では、これはどのように機能するのでしょうか。どうやらtype を持つ必要がありObjectますが、正しい変数にどのように指示すればよいでしょうか?

4

2 に答える 2

20

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

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

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

Node1というアクセス可能なメンバーがあれば、質問の残りのコードは問題ありませんdist

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

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

(の種類に応じて、 etc にInteger置き換えます。)DoubleNode1.dist

于 2013-04-05T17:42:33.163 に答える
4

ここ (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;
    }
}
于 2013-04-05T18:01:30.170 に答える