Java PriorityQueue remove的意外行为:为什么不';与过去相比没有什么区别?

Java PriorityQueue remove的意外行为:为什么不';与过去相比没有什么区别?,java,equals,priority-queue,compareto,Java,Equals,Priority Queue,Compareto,我正在尝试使用优先级队列,但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

我正在尝试使用优先级队列,但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());
PriorityQueue pq=new PriorityQueue();
OwnClass a=新的OwnClass(1);
OwnClass b=新的OwnClass(2);
OwnClass c=新的OwnClass(3);
pq.增加(a);
pq.增加(b);
pq.添加(c);
System.out.println(“head:+pq.peek());
pq.移除(新类(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;        
    }
}
class-ownclase实现了可比较的{
int x;
公有类(int x){
这个.x=x;
}
公共整数比较对象(对象arg0){
OwnClass a=(OwnClass)arg0;
如果(a.x>this.x)
返回-1;
如果(a.x
remove()
不使用
compareTo()
,它将使用
equals()
查找要删除的对象。您还需要在类上重写
equals()

编辑:对于
PriorityQueue
(谢谢@templatetypedef)

remove()
将不使用
compareTo()
,而是使用
equals()
查找要删除的对象。您还需要在类上重写
equals()


编辑:对于
PriorityQueue
(谢谢@templatetypedef)

类的
remove
方法具有以下描述:

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

因此,在决定是否删除某个内容时,不使用
compareTo
。我认为这是因为
PriorityQueue
实现了
收集
,因此
删除
的行为必须与
收集
中指定的行为一致,即

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

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


希望这有帮助!

优先级队列
类的
remove
方法具有以下描述:

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

因此,在决定是否删除某个内容时,不使用
compareTo
。我认为这是因为
PriorityQueue
实现了
收集
,因此
删除
的行为必须与
收集
中指定的行为一致,即

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

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


希望这有帮助!

请注意,PriorityQueue还有一个构造函数,它使用比较器。
因此,即使使用了比较器,或者priorityQueue中的对象实现了可比较接口,也可以保持删除行为的一致性。equals不依赖于任何比较,除了对象的base equals属性。

请注意,priorityQueue还有一个采用比较器的构造函数。
因此,即使使用了比较器,或者priorityQueue中的对象实现了Compariable接口,equals也可以保持删除行为的一致性。equals不依赖于任何比较,除了对象的base equals属性。

您还没有重写
equals
方法;也许这就是问题所在?但是compareTo()方法是否足够?,因为它可以用来检查等式它可以也应该使用,并且在编写可比较类时,根据约定,必须使其在compareTo()==0时等于()==true。但是,类可以违反此约定,通常是偶然的。在这种情况下,OwnClass不重写equals违反了约定;只需检查new OwnClass(1)。equals(new OwnClass(1))返回的内容(尽管compareTo将返回0)。您还没有重写
equals
方法;也许这就是问题所在?但是compareTo()方法是否应该足够?因为它可以用来检查等式它可以而且应该被使用,并且根据约定,当您编写一个可比较的类时,您必须使其在compareTo()==0时等于()==true。但是,类可以违反此约定,通常是偶然的。在这种情况下,OwnClass不重写equals违反了约定;只需检查new OwnClass(1)。equals(new OwnClass(1))返回的内容(尽管compareTo将返回0)。有关更多详细信息,请参见。我理解,但wy是以这种方式实现的吗?编写两个方法的代码是没有意义的,因为只有一个方法就足够了
remove(Object)
获取
对象
-它不必是相同的(通用的)
PriorityQueue
的类型。因此,不能将其强制到
Comparable
界面中。我假定其原因是