2009-03-22 19 views
7

Chciałbym zawinąć klasy PriorityQueue java w clojure do użytku w innej części mojego programu. Próbuję dowiedzieć się, czy istnieje sposób, aby zrobić to w sposób lispy i uczynić kolejkę priorytetową niezmienną. Czy są jakieś dobre sposoby, aby to zrobić, czy też po prostu lepiej będzie używać PriorityQueue jako zmiennej struktury danych?Jak ustawić niezmienną klasę Java w Clojure?

Odpowiedz

8

Nie sądzę, że istnieje prosty sposób na zawijanie zmiennej struktury danych jako niezmiennej. Niezmienne struktury danych stają się wydajne, gdy nowa wersja może współużytkować dane ze starszą wersją w sprytny sposób i nie mogę naprawdę zobaczyć, jak można to zrobić bez dostępu do elementów wewnętrznych z PriorityQueue.

Jeśli naprawdę chcesz, aby stała kolejka priorytetowa this thread była interesująca. Wydaje się, że te wstawki mają liniowy czas, więc jeśli jest to problem, być może trzeba poszukać innej implementacji.

Edycja: Po chwili namysłu, prosta implementacja kolejki priorytetowej jest po prostu do przechowywania (prio, wartość) -para w posortowanym zestawie. Coś takiego:

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

Oczywiście powyższy kod jest dość ograniczony (na przykład brak wielu wpisów), ale ilustruje ten pomysł.

+0

W jaki sposób sortowany zestaw jest znany z sortowania według priorytetu w parze (prio, value)? –

+0

Clojure porównuje wektory leksykograficznie, więc najpierw sortuje według priorytetu, a druga według wartości. – CAdaker

+0

W rzeczywistości, patrząc na źródło, tylko wektory o równej długości są porównywane leksykograficznie. Ale to nie jest problem w tym przypadku. – CAdaker

7

Nie można zautomatyzować modyfikacji klasy niezmiennej. Zawsze można bezpośrednio wywołać klasę Java i zmutować ją.

Aby wymusić niezmienność, można ją zaimplementować w clojure lub rozszerzyć klasę java i zgłaszać wyjątki we wszystkich implementacjach metod zmiennych.