2009-03-22 3 views
7

내 프로그램의 다른 부분에서 사용하기 위해 java의 PriorityQueue 클래스를 clojure로 포장하고 싶습니다. 내가 알아 내려는 것은 불분명하게이를 수행하고 우선 순위 큐를 변경 불가능하게 만들 수있는 방법이 있는지입니다. 이 작업을 수행 할 수있는 좋은 방법이 있습니까? 아니면 변경 가능한 데이터 구조로 PriorityQueue를 사용하는 것이 나을 것입니까?Clojure에서 Java 클래스를 불변으로 만드는 방법은 무엇입니까?

답변

8

변경할 수있는 데이터 구조로 변경 가능한 데이터 구조를 래핑하는 간단한 방법은 없다고 생각합니다. 변경 불가능한 데이터 구조는 새 버전이 이전 버전과 데이터를 영리하게 공유 할 수있을 때 효율적이되고 PriorityQueue의 내부에 액세스하지 않고 이것이 어떻게 수행되는지 실제로 볼 수 없습니다.

정말로 영구적 인 우선 순위 큐 this thread을 원한다면 흥미로울 것입니다. 그것들은 선형 시간 삽입을 가지고있는 것처럼 보이므로, 이것이 문제라면 다른 구현을 찾아야 할 것입니다.

편집 : 두 번째 생각에, 영구적 인 우선 순위 대기열의 간단한 구현은 정렬 된 집합에 (prio, value) 쌍을 저장하는 것입니다. 예 :

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

위 코드는 매우 제한적이지만 (예 : 여러 항목이 없음) 아이디어를 설명합니다.

+0

정렬 된 집합은 (prio, value) 쌍으로 prio별로 정렬하는 것을 어떻게 알 수 있습니까? –

+0

Clojure는 사전 식으로 벡터를 비교하므로 먼저 우선 순위에 따라 정렬하고 두 번째로 정렬합니다. – CAdaker

+0

실제로 원본을 보면 같은 길이의 벡터 만 사전 식으로 비교됩니다. 그러나이 경우에는 문제가되지 않습니다. – CAdaker

7

변경할 수있는 클래스를 자동으로 변경할 수 없습니다. 항상 Java 클래스를 직접 호출하여 변경할 수 있습니다.

불변성을 강요하려면 clojure로 구현하거나 java 클래스를 확장하고 모든 변경 가능한 메소드 구현에서 예외를 throw 할 수 있습니다.