Java PriorityQueue remove的意外行为:为什么不';与过去相比没有什么区别?
我正在尝试使用优先级队列,但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
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.xremove()
不使用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
界面中。我假定其原因是