对于这个类,删除优先级队列的功能不能正常工作 在实施dijkstra的Algo时。这是我创建的类 优先级队列中的元素排序。尽管优先级队列正在删除 正确的min元素,它的remove(object o)方法不是 正确删除元素
public class IntegerArray implements Comparable<IntegerArray> {
public double[] a;
IntegerArray(double x,double y){
a= new double[2];
a[0]=x;
a[1]=y;
}
public boolean equals(IntegerArray x){
if(this.a[0]==x.a[0] & this.a[1] ==x.a[1]){
return true;
}
else return false;
}
public int compareTo(IntegerArray x){
if(this.a[1] > x.a[1]){
return 1;
}
else if(this.a[1] < x.a[1]){
return -1;
}
else return 0;
}
///////这是使用优先级队列的Dijsktra算法的代码
for (int i = 0; i < graph.get((int) node).size(); i++) {
alt = (int) (dist[(int) node] + graph.get((int) node).get(i).weight);
if (alt < dist[ graph.get((int) node).get(i).vertex]) {
temp1.a[0]=graph.get(node).get(i).vertex;
temp1.a[1]=dist[graph.get(node).get(i).vertex];
System.out.println("temp1" +" "+ temp1.a[0]+ " "+ temp1.a[1]);
Q.remove(temp1); //it is not removing though the object instance is present in the queue
dist[graph.get(node).get(i).vertex] = alt;
pred[graph.get(node).get(i).vertex] = node;
temp1.a[1]=dist[graph.get(node).get(i).vertex];
System.out.println("temp1" +" "+ temp1.a[0]+ " "+ temp1.a[1]);
Q.add(temp1);
}
答案 0 :(得分:1)
您的方法equals
不正确。正确的方法有签名public boolean equals(Object o)
,而你的签名public boolean equals(IntegerArray x)
(参数的类型不同,方法不同)。
在PriorityQueue.remove
中,调用equals(Object)
,因为您没有定义它,所以调用默认实现(按身份比较)。
请改为尝试:
public boolean equals(Object o){
IntegerArray x = (IntegerArray)o;
return this.a[0] == x.a[0] && this.a[1] == x.a[1];
}
[更新]代码冗余减少。
答案 1 :(得分:-1)
我的错误是我传递了重复对象的引用,即temp1而不是原始对象的引用。