Mi piacerebbe racchiudere la classe PriorityQueue di java in clojure per l'utilizzo in un'altra parte del mio programma. Quello che sto cercando di capire è se c'è un modo per farlo in maniera lispy e rendere la coda di priorità immutabile. Ci sono dei buoni modi per farlo, o sto meglio usando il PriorityQueue come una struttura dati mutevole?Come posso rendere immutabile una classe Java in Clojure?
risposta
Non penso che ci sia un modo semplice per avvolgere una struttura dati mutevole come immutabile. Le strutture di dati immutabili diventano efficienti quando la nuova versione può condividere i dati con la vecchia versione in modo intelligente, e non riesco davvero a vedere come questo possa essere fatto senza accedere agli interni di PriorityQueue
.
Se si desidera realmente una coda di priorità persistente, this thread potrebbe essere interessante. Tuttavia, quelli sembrano avere inserimenti in tempo lineare, quindi se questo è un problema, forse devi cercare un'altra implementazione.
Modifica: A pensarci bene, un'implementazione semplice di una coda di priorità permanente è solo per memorizzare le coppie (prio, valore) in un set ordinato. Qualcosa di simile a questo:
(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)))
Naturalmente, il codice di cui sopra è piuttosto limitata (non più voci, per esempio) ma illustra l'idea.
Non è possibile rendere automagicamente immutabile la classe mutabile. Si può sempre chiamare direttamente la classe Java e mutarlo.
Per forzare l'immutabilità, è possibile implementarlo in clojure oppure estendere la classe java e generare eccezioni in tutte le implementazioni del metodo mutabile.
- 1. Come posso trasmettere una classe Java in Clojure?
- 2. Coda immutabile in Clojure
- 3. Esiste una libreria .net che ha una classe Vector immutabile persistente (come trovata in Clojure/Scala)?
- 4. Crea una classe Java come sequenza in Clojure
- 5. In Clojure, come utilizzare una classe java in modo dinamico?
- 6. Classe immutabile vs Struttura immutabile
- 7. Come si può creare una classe astratta e immutabile?
- 8. Estensione di una classe Java Swing in Clojure
- 9. Design di classe immutabile
- 10. Come mappare una classe come immutabile usando FluentNHibernate?
- 11. Esiste un modo per rendere immutabile una matrice ordinaria in Java?
- 12. Come posso mappare una macro in Clojure?
- 13. immutabile di una classe quando un'istanza variabile presente come arraylist
- 14. Come posso creare una lista doppiamente immutabile in C#?
- 15. Aggiornamenti polimorfici in una gerarchia di classe immutabile
- 16. Il modo migliore per definire una classe immutabile nell'obiettivo C
- 17. Come posso rendere un campo non serializzabile in java?
- 18. Rendere una classe non ereditata
- 19. fare una classe immutabili in Java
- 20. Come rendere una classe Thread Safe
- 21. Come si rende una struttura immutabile?
- 22. Come rendere una classe interna Parcelable
- 23. Posso rendere una classe non sigillata internamente ma sigillata esternamente?
- 24. Come posso copiare un oggetto immutabile come tupla in Python?
- 25. Android: Rendere una classe parcellabile
- 26. Come trasformare una raccolta mutevole in una immutabile
- 27. Come accedere alla classe Java interna statica tramite l'interoperabilità Clojure?
- 28. Come creare una classe dinamicamente in java
- 29. Come estendere una classe finale in Java
- 30. Come faccio a rendere questa macro variadic in clojure?
Come sa ordinare il set ordinato per prio nella coppia (prio, valore)? –
Clojure confronta i vettori lessicograficamente, quindi verrà prima ordinato per priorità e secondo per valore. – CAdaker
In realtà, guardando la sorgente, vengono confrontati lessicograficamente solo vettori di uguale lunghezza. Ma non è un problema in questo caso. – CAdaker