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

我认为输出最终输出应该是 2,因为我要删除添加的“1”。compareTo() 应该由优先级队列 remove() 使用,但他的情况似乎并非如此。我做错了什么?我知道 pq.remove(a) 会起作用,但是我的代码也应该起作用

4

3 回答 3

8

remove()不会使用compareTo(),而是会使用equals()来查找要删除的对象。您还需要覆盖equals()您的课程。

编辑:JavadocPriorityQueue谢谢,@templatetypedef)

于 2012-01-18T07:47:24.157 回答
2

该类PriorityQueueremove方法有以下描述:

从此队列中移除指定元素的单个实例(如果存在)。更正式地说,删除一个元素 e 使得o.equals(e),如果这个队列包含一个或多个这样的元素。当且仅当此队列包含指定元素时(或等效地,如果此队列因调用而更改)返回 true。

因此compareTo在确定是否要remove某事时不使用。我相信这是因为PriorityQueue实现Collectionremove因此 的行为必须与中指定的行为一致Collection,即

从此集合中移除指定元素的单个实例(如果存在)(可选操作)。更正式地说,如果这个集合包含一个或多个这样的元素,则删除一个元素 e 使得 (o==null ? e==null : o.equals(e))。

换句话说,我相信这个设计决策的动机是试图PriorityQueue融入Collection框架,尽管这有点奇怪。

希望这可以帮助!

于 2012-01-18T07:51:40.623 回答
2

请注意,PriorityQueue 有另一个带有 Comparator 的构造函数。因此,即使使用 Comparator 或 priorityQueue 中的对象实现 Comparable 接口,也可以保持删除行为一致,equals 不依赖于对象的基本 equals 属性之外的任何比较。

于 2012-01-19T04:03:33.327 回答