2009-03-22 13 views
7

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

8

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.

+0

Come sa ordinare il set ordinato per prio nella coppia (prio, valore)? –

+0

Clojure confronta i vettori lessicograficamente, quindi verrà prima ordinato per priorità e secondo per valore. – CAdaker

+0

In realtà, guardando la sorgente, vengono confrontati lessicograficamente solo vettori di uguale lunghezza. Ma non è un problema in questo caso. – CAdaker

7

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.

Problemi correlati