Java-Priorität-Warteschlange mit einem benutzerdefinierten anonyme comparator
Verzeihen Sie mir, wenn dies ist eine bewährte Frage, aber ich habe ein wenig Schwierigkeiten es herauszufinden.
Ich habe derzeit eine Klasse Knoten, und jeder Knoten' ist ein Quadrat, das in einem Labyrinth. Ich versuche, die Umsetzung des A* - Algorithmus, so dass jeder Knoten ein f-Kosten (int) Daten-member innerhalb der it. Ich Frage mich, ob es einen Weg gibt, dass ich eine priority-queue der Knoten, und legen Sie die f-Kosten-variable als Komparator?
Habe ich mir angeschaut Beispiele online, aber alles was ich finden kann, sind String, priority queues. Kann ich implementieren Komparator für die Knoten-Klasse? Würde dies mir erlauben, auf die Daten zugreifen, Mitglied gespeichert drin?
Vielen Dank!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Absolut.
Können Sie eine
PriorityQueue
basiert auf einer anonymenComparator
an den Konstruktor übergeben:Wenn Ihr
Node
Klasse bereits implementiertComparable
Sie nicht sogar brauchen, um eine neue zu definierenComparator
, wie die Bestellung wird standardmäßig verwendet. Sofern keine andere Methode, die Natürliche Bestellung zwischen Objekten verwendet werden.Aus den Javadocs:
Außerdem, PriorityQueues Unterstützung von generischen Datentypen. Daher, wenn Sie implementieren
Comparable
in Ihren Knoten-Klasse, dann erstellen Sie einPriorityQueue<Node>
und verwenden Sie es normalerweise.Abwechselnd, es gibt einen Konstruktor
PriorityQueue(int initialCapacity, Comparator<? super E> comparator)
nimmt, dass in einem Komparator als Teil derPriorityQueue
Konstruktor. Wenn Sie diese Methode vorziehen, Ihre Knoten-Klasse nicht brauchen, um enthalten die extra-code, der benötigt wird, wenn die ErbenComparable
.}
wenn compareTo liefert eine negative int, es bedeutet "weniger als", " 0 " bedeutet "entspricht", 1 bedeutet "größer als"
dass eine Funktion ist alles was Sie brauchen, um in der Lage sein zu verwenden, PriorityQueue.
EDIT: Vergleich den anderen Weg, ich Durcheinander, dass bis. -1 < | 0 = | 1 > ich alreays Lesen, diese von rechts nach Links aus irgendeinem Grund.
Gibt es eine PriorityQueue Klasse in java.util. Können Sie es verwenden, und es wird entweder der natürlichen Ordnung (Knoten implementiert Vergleichbar) oder einen Komparator geliefert, die im Konstruktor (wenn Sie nicht möchten, dass code in Ihre Knoten-Klasse). Jede Klasse kann auf alle Daten innerhalb eines anderen, solange Sie es zulassen, indem Sie entweder ein Feld nicht-privaten (möglicherweise schlechten OOP-Stil) oder durch Lieferung einer accessor-Methode public int getG(), public int getH(), public int getF().