1

プライオリティ キューを使用しようとしていますが、remove() が機能しません: 私のコード:

PriorityQueue<OwnClass> pq=new PriorityQueue<OwnClass>();
OwnClass a=new OwnClass(1);
OwnClass b=new OwnClass(2);
OwnClass c=new OwnClass(3);
pq.add(a);
pq.add(b);
pq.add(c);
System.out.println("head:"+pq.peek());
pq.remove(new OwnClass(1));
System.out.println(pq.peek());

そしてクラスの実装:

class OwnClass implements Comparable{

    int x;

    public OwnClass(int x){
        this.x=x;
    }

    public int compareTo(Object arg0) {

        OwnClass a=(OwnClass) arg0;
        if(a.x>this.x)
            return -1;
        if(a.x<x)
            return 1;
        return 0;
    }

    public String toString(){
        return ""+x;        
    }
}

追加された「1」を削除しているため、出力の最終出力は2になるはずです。compareTo() は優先キュー remove() で使用する必要がありますが、そうではないようです。私が間違っていることは何ですか?pq.remove(a) が機能することはわかっていますが、私のコードも機能するはずです

4

3 に答える 3

8

remove()は使用せず、削除するオブジェクトを見つけるためcompareTo()に使用します。クラスでもequals()オーバーライドする必要があります。equals()

編集:(ありがとう、@templatetypedef)のJavadocPriorityQueue

于 2012-01-18T07:47:24.157 に答える
2

PriorityQueue には、コンパレータを取る別のコンストラクタがあることに注意してください。したがって、Comparator が使用されている場合や、priorityQueue 内のオブジェクトが Comparable Interface を実装している場合でも、削除動作の一貫性を保つことができます。equals は、オブジェクトの基本 equals プロパティ以外の比較に依存しません。

于 2012-01-19T04:03:33.327 に答える
2

PriorityQueueクラスのメソッドremoveには次の説明があります。

指定された要素の単一インスタンスが存在する場合、このキューから削除します。より正式には、o.equals(e)このキューにそのような要素が 1 つ以上含まれている場合、そのような要素 e を削除します。このキューに指定された要素が含まれている場合にのみ (または、呼び出しの結果としてこのキューが変更された場合)、true を返します。

したがって、何かcompareToを行うかどうかを判断するときには使用されませんremove。これは が をPriorityQueue実装しているためCollectionであり、したがって の動作はでremove指定された動作と一致している必要があるためだと思います。Collection

指定された要素の 1 つのインスタンスが存在する場合は、このコレクションから削除します (オプションの操作)。より正式には、(o==null ? e==null : o.equals(e)) となる要素 e を削除します (このコレクションにそのような要素が 1 つ以上含まれている場合)。

言い換えれば、この設計上の決定は、少し奇妙ではありますがPriorityQueue、フレームワークに適合しようとすることによって動機付けられていると思います.Collection

お役に立てれば!

于 2012-01-18T07:51:40.623 に答える