Frage

würde Ich mag die Java-Klasse in Priorityqueue clojure für die Verwendung in einem anderen Teil meines Programms wickeln. Was ich versuche, herauszufinden, ob es eine Möglichkeit ist, dies in einer lispy Weise zu tun, und die Prioritätswarteschlange unveränderlich zu machen. Gibt es gute Möglichkeiten, dies zu tun, oder bin ich sein würde nur besser die Priorityqueue als änderbare Datenstruktur?

War es hilfreich?

Lösung

Ich glaube nicht, dass es eine einfache Möglichkeit ist es, eine veränderbare Datenstruktur als unveränderliches ein wickeln. Unveränderliche Datenstrukturen werden wirksam, wenn die neue Version von Daten mit der alten Version in kluger Weise gemeinsam nutzen kann, und ich kann nicht wirklich sehen, wie dies mit dem Interna von PriorityQueue ohne Zugang getan werden kann.

Wenn Sie wirklich eine persistente Prioritätswarteschlange diesen Thread wollen könnte sei interessant. Diejenigen, scheint allerdings lineare Zeiteinsätze zu haben, so dass, wenn ein Problem haben Sie vielleicht für eine andere Implementierung suchen.

Edit: Am zweiten Gedanken, eine einfache Implementierung einer persistenten Prioritätswarteschlange ist nur die (Prio, value) zu speichern -Paare in einem sortierten Satz. So etwas wie folgt aus:

(defn make-pqueue []
  (sorted-set))

(defn pqueue-add [pq x prio]
  (conj pq [prio x]))

(defn pqueue-peek [pq]
  (first pq))

(defn pqueue-pop [pq]
  (let [top (first pq)]
    (disj pq top)))

Natürlich oberhalb der Code ziemlich begrenzt ist (keine mehrere Einträge, zum Beispiel), aber es zeigt die Idee.

Andere Tipps

Sie können nicht automatisch veränderbare Klasse unveränderlich machen. Man kann immer Java-Klasse direkt anrufen und mutiert es.

Um Unveränderlichkeit zu zwingen Sie können entweder implementieren es in Clojure, oder Java-Klasse erweitern und Ausnahmen in allen änderbaren Methodenimplementierungen werfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top