2015-02-15 4 views
0

для этого класса, удалите функцию очереди приоритета, не работает должным образом при внедрении Aljgo dijkstra's. Это класс, я создал для сортировки элементов в Priority Queue.Though очередь приоритета удаление минимального элемент правильно, это удалить метод (объект о) не удаления элементов правильноФункция удаления приоритета очереди не работает

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

} 
+1

Вам необходимо переопределить функцию 'int hashCode()'. – parakmiakos

+0

Можете ли вы вставить, какой вывод вы видите на консоли при запуске программы и какие элементы присутствуют в вашей очереди? @parakmiakos я не думаю, что hashcode поможет здесь, то есть не используется PriorityQueue – SMA

+0

, он создает (насколько я вижу) новый объект 'temp1', а затем вызывает' remove (temp1) '. Я думаю, ему нужно переопределить hashCode, потому что он в основном просит удалить из очереди объект с теми же значениями, что и другой, а не с той же ссылкой. – parakmiakos

ответ

-1

Моя ошибка в том, что я передаю ссылку дублирующего объекта i.e, temp1, а не ссылку на исходный объект.

+0

Правда. Это основная причина вашей ошибки. Но взгляните на другие ответы, чтобы понять, почему это происходит и каков правильный путь. – CKing

1

Ваш метод equals неверен. Правильный метод имеет подпись public boolean equals(Object o), тогда как у вас есть public boolean equals(IntegerArray x) (тип аргумента отличается, методы разные).

В PriorityQueue.remove это вызванный вызов, и поскольку вы его не определяете, вызывается реализация по умолчанию (сравнение по идентификатору).

Попробуйте вместо этого:

public boolean equals(Object o){ 
    IntegerArray x = (IntegerArray)o; 
    return this.a[0] == x.a[0] && this.a[1] == x.a[1]; 
} 

[Update] избыточного кода уменьшается.

+0

, хотя функция remove возвращает true, она не всегда удаляет указанный элемент и вместо этого удаляет первый. – ninjaCoder

+0

Если это возвращает true, это означает, что он удален _something_. Вы дважды добавили один и тот же элемент? Можете ли вы распечатать все значения, чтобы увидеть, что именно изменилось? –

+0

удаляет элемент min, присутствующий в очереди. – ninjaCoder

Смежные вопросы