优先级队列删除功能不起作用

时间:2015-02-15 08:53:41

标签: java

对于这个类,删除优先级队列的功能不能正常工作 在实施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);

}

2 个答案:

答案 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而不是原始对象的引用。