Pregunta

Me gustaría envolver clase PriorityQueue de Java en clojure para su uso en otra parte de mi programa. Lo que estoy tratando de averiguar es si hay alguna manera de hacer esto de una manera lispy y hacer la cola de prioridad inmutable. ¿Hay buenas maneras de hacer esto, o soy sólo va a ser mejor usar el PriorityQueue como una estructura de datos mutables?

¿Fue útil?

Solución

No creo que hay una manera sencilla para envolver una estructura de datos mutables como inmutable. estructuras de datos inmutables ser eficientes cuando la nueva versión puede compartir los datos con la versión anterior de manera inteligente, y yo realmente no pueden ver cómo se puede hacer esto sin tener acceso a la parte interna de PriorityQueue.

Si usted realmente quiere un persistente cola de prioridad este hilo podría ser interesante. Aquellos parece tener tiempo lineal inserta, así que si eso es un problema tal vez usted tiene que buscar otra aplicación.

Editar: Pensándolo bien, un simple aplicación de una cola de prioridad persistente es sólo para almacenar los (PRIO), valor -pairs en un conjunto ordenado. Algo como esto:

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

Por supuesto, el código anterior es bastante limitado (no hay entradas múltiples, por ejemplo) pero ilustra la idea.

Otros consejos

No se puede hacer automagicamente clase mutable inmutable. Uno siempre puede llamar a la clase java y mutar directamente a él.

Para forzar la inmutabilidad usted puede ponerlo en práctica en clojure, o extender la clase Java y lanzar excepciones en todas las implementaciones de métodos mutable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top