5 Stimmen

Wie kann ich ein bestimmtes Element in der Warteschlange mit Priorität löschen?

import java.util.*;

public class test4 {
  public static void main(String[] args){
    PriorityQueue[] P = new PriorityQueue[10];
    P[1] = new PriorityQueue();
    P[1].add(new ClassEntry(1.2,1));
    P[1].add(new ClassEntry(1.5,2));
    P[1].add(new ClassEntry(1.2,3));
    P[1].add(new ClassEntry(10,4));

    P[1].remove(new ClassEntry(10,4));//Ich kann dieses Objekt nicht löschen???

    System.out.println(P[1].size());
    ClassEntry ce = (ClassEntry) P[1].peek();
    System.out.println(P[1].size());
    System.out.println(ce.sim+"\t"+ce.index);
  }
}

Warum kann ich (10,4) nicht löschen? Kann mir jemand beibringen, wie man das implementiert...danke!

6voto

rodion Punkte 14419

ClassEntry muss Object.equals(Object o) überschreiben und implementieren, damit remove funktioniert. Zum Beispiel:

class ClassEntry{
  float a;
  int b;

  public ClassEntry(float a, int b){
    //...
  }

  @Override
  public boolean equals(Object o){
    if(o instanceof ClassEntry){
      ClassEntry c = (ClassEntry)o;
      return a == c.a && b == c.b;
    }
    return false;
  }
}

EDIT: Wie freundlicherweise von @Jim Garrison hingewiesen wurde, wenn Sie equals nicht implementieren, wird das Standardverhalten verwendet, das darauf abzielt, Objekte nach Referenz zu vergleichen. In diesem Fall müssen Sie wie folgt entfernen, damit Ihr Code funktioniert:

PriorityQueue[] P = new PriorityQueue[10];
P[1] = new PriorityQueue();
ClassEntry entry = new ClassEntry(10,4);
P[1].add(entry);
// Objekt mit dem gleichen Bezug wie das hinzugefügte entfernen
P[1].remove(entry);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X