2010-12-28 14 views
4
import java.util.*; 

public class test4 { 
    public static void main(String[] args){ 
    PriorityQueue[] P = new PriorityQueue[10]; 
    P[1] = new PriorityQueue<ClassEntry>(); 
    P[1].add(new ClassEntry(1.2,1)); 
    P[1].add(new ClassEntry(1.5,2)); 
    P[1].add(new ClassEntry(1.2,3)); 
    P[1].add(new ClassEntry(10,4)); 

    P[1].remove(new ClassEntry(10,4));//I can't delete this object??? 

    System.out.println(P[1].size()); 
    ClassEntry ce = (ClassEntry) P[1].peek(); 
    System.out.println(P[1].size()); 
    System.out.println(ce.sim+"\t"+ce.index); 
    } 
} 

なぜ(10,4)を削除できないのですか?誰かが実装する方法を教えることができます...ありがとう!優先度キューの特定の要素を削除するにはどうすればよいですか?

答えて

4

ClassEntryは、削除するにはObject.equals(Object o)をオーバーライドして実装する必要があります。たとえば:

class ClassEntry{ 
    float a; 
    int b; 

    public ClassEntry(float a, int b){ 
    //... 
    } 

    @Override 
    public boolean equals(Object o){ 
    if(o instanceof ClassEntry){ 
     ClassEntry c = (ClassEntry)o; 
     return a == c.a && b == c.b; 
    } 
    return false; 
    } 
} 

EDIT:あなたが参照によってオブジェクトを比較することで、デフォルトの動作を、等しく実装していない場合は親切に、@Jimギャリソンによって指摘されたとして、使用されています。この場合、コードを正常に動作させるには、次のように削除する必要があります:

PriorityQueue[] P = new PriorityQueue[10]; 
P[1] = new PriorityQueue<ClassEntry>(); 
ClassEntry entry = new ClassEntry(10,4); 
P[1].add(entry); 
//remove object with the same reference as the added one 
P[1].remove(entry); 
+2

+1明確化:キューは、2つのオブジェクトが「等しい」かどうかを判断する方法を知っている必要があります削除したい関心のある「等しい」条件を実装するコードを提供しない場合は、メモリ内のオブジェクトアドレスを比較するjava.lang.Objectからデフォルトのequals()を取得します。 –

+0

コメントありがとうございます。私はそれに応じて自分の投稿を更新しました。 – rodion

+0

ありがとうございます!しかし、私はどのように私はequals機能の仕事をさせることができますか分からないのですか?私はtest4クラスでequals()を呼び出す必要がありますか? – LoveTW

関連する問題