2013-04-05 21 views
12

min優先度のキューを使用するアルゴリズムを作成しようとしていますので、私はgoogleで検索し、PriorityQueueを見つけました。しかし、それを使用するには、どのように優先順位を付けたいのか、それを行う方法はコンパレータを使っていることを伝える必要があります(私の "Node1"の特定のデータフィールドを比較したい、オブジェクト)。より多くのグーグルが、Comparatorを実装する新しいコンパレータを作成するという考えを示しましたが、compareメソッドをオーバーライドしました。私は何をしようとしています、この(と同様にそれの他のバリエーション)である:Javaコンパイラの実装

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; 
    } 
} 

私は上に苦しむことがあると言うコンパレータクラスを(持っていないということであるそのうちの一つ、いくつかの理由で、コンパイラの抗議、抽象的な)

error: distComparator is not abstract and does not override abstract method compare(Object,Object) in Comparator

この問題を処理する「compare(object x、object y)」と言っています。この時点でコンパイラはxまたはyの "dist"変数を見つけることができないと訴えていますが、ObjectクラスではなくNode1クラスの一部であるため意味があります。

これはどのように動作するはずですか?それは明らかにタイプObjectでなければなりませんが、正しい変数にどのように向けるのですか?

答えて

15

あなたがComparator<Node1>を実装する必要があります。これがないと

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

、あなたが望むものではありません(動作しますが、面倒な価値はありません)Comparator<Object>を、実施しています。

Node1distという名前のアクセス可能なメンバーがあることを条件として、残りのコードは問題ありません。あなたは、Java 7を使用している場合は、この方法の全体の体は

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

と交換することができることを

注意(Node1.distの種類に応じて、DoubleなどでIntegerを交換してください。)

+0

ます。また 'リターンx.distを書くことができます - y.dist' – Polygnome

+1

@Polygnomeを:これを関与範囲に応じてよく、またはかもしれません整数では機能しませんが、浮動小数点値の完全な非スターターです。 – NPE

+0

ありがとう!解決済み! –

2

として、 hereが表示されます。 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; 
    } 
} 
+2

'[]'の代わりに '<>'を使う –