Ich verwende eine Prioritätswarteschlange, um eine große Anzahl von benutzerdefinierten Objekten zu sortieren und zu verwenden. Die Objekte haben ein "Gewicht", das ihre natürliche Ordnung ist. Verschiedene Objekte, die in die Prioritätswarteschlange eingefügt werden, können jedoch dasselbe "Gewicht" haben. In solchen Fällen möchte ich, dass die Prioritätswarteschlange sie in der Reihenfolge anordnet, in der sie in die Warteschlange eingereiht wurden.PriorityQueue hat Objekte mit derselben Priorität
Zum Beispiel, wenn ich in CustomObjects A hinzufügen, B, C, D in dieser Reihenfolge, alle mit dem gleichen „Gewicht“, als die Prioritätswarteschlange sie in dieser Reihenfolge auch zurückkehren sollte - auch wenn ich eine Umfrage oder mehr der Objekte vor dem Hinzufügen in den anderen.
Hier ist die CompareTo für mein benutzerdefiniertes Objekt ist:
public int compareTo(CustomObject o) {
int thisWeight = this.weight;
int thatWeight = o.weight;
if(thisWeight < thatWeight){
return -1;
}
else{
return 1;
}
}
Während ich dachte, dass dies, dass die Erstbestellung halten würde, ist es nicht. Dies tritt auf, wenn ich A, B, C mit der Gewichtung 1 eingabe; Umfrage A; und addiere D, E auch mit Gewicht 1. Irgendwie sind D und E nach B sortiert, aber vor C.
Ich bin mir bewusst, dass der Iterator für PriorityQueues nicht die richtige Reihenfolge zurückgibt, so dass ich in meiner limitiert bin Fähigkeit, die Reihenfolge zu betrachten - aber ich kann die Reihenfolge sehen, dass die Elemente die Warteschlange verlassen und es folgt eindeutig nicht dem Weg, den ich es will.
Vorschläge?
@Stephan: Aktualisierte Antwort – Cratylus
Ich habe gerade mein eigenes compareTo geändert, indem ich eine extra if else-Anweisung hinzugefügt habe. Aber was das eigentliche Fleisch der Antwort angeht - Perfekt, danke! – USS1994