Me gustaría ajustar la clase PriorityQueue de java en clojure para usar en otra parte de mi programa. Lo que estoy tratando de averiguar es si hay alguna manera de hacer esto de una manera lisa y hacer que la cola de prioridad sea inmutable. ¿Hay alguna buena manera de hacerlo, o voy a estar mejor utilizando PriorityQueue como una estructura de datos mutable?¿Cómo puedo hacer que una clase Java sea inmutable en Clojure?
Respuesta
No creo que haya una manera simple de envolver una estructura de datos mutable como una inmutable. Las estructuras de datos inmutables se vuelven eficientes cuando la nueva versión puede compartir datos con la versión anterior de manera inteligente, y realmente no puedo ver cómo se puede hacer sin el acceso a las partes internas de PriorityQueue
.
Si realmente quiere una cola de prioridad persistente this thread podría ser interesante. Sin embargo, parece que tienen insertos de tiempo lineal, por lo que si ese es un problema, quizás tenga que buscar otra implementación.
Editar: Pensándolo bien, una implementación simple de una cola de prioridad persistente es solo para almacenar los pares (prio, value) 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.
No se puede convertir automáticamente la clase mutable en inmutable. Uno siempre puede llamar a la clase Java directamente y mutarla.
Para forzar la inmutabilidad, puede implementarlo en clojure o extender la clase java y lanzar excepciones en todas las implementaciones de métodos mutables.
- 1. hacer una clase inmutable en java
- 2. ¿Cómo puedo hacer que esta clase sea IEnumerable?
- 3. ¿Cómo puedo lanzar una clase de Java en Clojure?
- 4. Cola inmutable en Clojure
- 5. ¿Cómo puedo hacer que una ventana LWJGL sea redimensionable?
- 6. ¿Cuál es la ventaja de que una cadena sea inmutable?
- 7. ¿Por qué se declararía una clase inmutable final en Java?
- 8. ¿Cómo puedo hacer que una UITextView no sea seleccionable?
- 9. ¿Cómo puedo hacer que una tabla sea desplazable
- 10. ¿Puedo hacer que una variable de miembro público sea privada en una clase derivada?
- 11. ¿Cómo hacer que una clase externa sea heredada de una clase interna?
- 12. ¿Puedo hacer que una carpeta sea editable en Medium trust?
- 13. ¿Cómo puedo hacer que mi aplicación sea secuenciable en C#?
- 14. ¿Cómo hacer que el programa Java sea instalable?
- 15. ¿Puedo hacer que un TTreeNode sea invisible?
- 16. ¿Puedo hacer que JUnit sea más detallado?
- 17. ¿Por qué no puedo hacer que String sea una instancia de una clase de tipo?
- 18. Clase mutable o inmutable?
- 19. ¿Cómo puedo restringir que una clase sea creable solo dentro de otra clase?
- 20. ¿Cómo puedo hacer la transición de Java a Clojure?
- 21. ¿Cómo puedo hacer que este código python sea menos feo
- 22. ¿Cómo hacer que el archivo sea escaso?
- 23. ¿Hay una biblioteca .net que tenga una clase vectorial inmutable persistente (como se encuentra en Clojure/Scala)?
- 24. En Clojure, ¿cómo usar una clase Java dinámicamente?
- 25. ¿Cómo hacer que la aplicación Java sea independiente?
- 26. ¿Puedo hacer que el diálogo de ProgressMonitor sea modal?
- 27. Hacer que una lista enlazada sea segura
- 28. ¿Cómo hacer que NSTableView sea transparente?
- 29. ¿Cómo hacer que una clase singleton sea segura para los hilos?
- 30. matriz inmutable en Java
¿Cómo sabe el conjunto ordenado ordenar por prio en el par (prio, valor)? –
Clojure compara vectores lexicográficamente, por lo que primero se ordenará por prioridad, y segundo por valor. – CAdaker
En realidad, mirando la fuente, solo los vectores de igual longitud se comparan lexicográficamente. Pero eso no es un problema en este caso. – CAdaker