Apache commons에있는 컬렉션 중 하나와 같이 언제든지 Java 라이브러리를 사용할 수 있습니다. TreeBidiMap은 java.util.Map
을 구현하므로 아무런 노력 없이도 순차화할 수 있습니다. 그들이 영속 콜렉션을 기대하기 때문에
user> (def x (org.apache.commons.collections.bidimap.TreeBidiMap.))
#'user/x
user> (.put x :foo :bar)
nil
user> (keys x)
(:foo)
user> (.getKey x :bar)
:foo
user> (:foo x)
:bar
user> (map (fn [[k v]] (str k ", " v)) x)
(":foo, :bar")
어떤 것들은, assoc
및 dissoc
처럼,하지만 작동하지 않으며 TreeBidiMap은 변경할 수 있습니다.
네이티브 Clojure에서이 작업을 실제로 수행하려는 경우 메타 데이터를 사용하여 역방향 해시를 보유 할 수 있습니다. 이것은 여전히 메모리 요구 사항을 두 배로 늘리고 추가 및 삭제할 때마다 시간을 두 배로 늘릴 것이지만 조회는 충분히 빠르며 적어도 모든 것이 번들로 제공됩니다.
(defn make-bidi []
(with-meta {} {}))
(defn assoc-bidi [h k v]
(vary-meta (assoc h k v)
assoc v k))
(defn dissoc-bidi [h k]
(let [v (h k)]
(vary-meta (dissoc h k)
dissoc v)))
(defn getkey [h v]
((meta h) v))
당신은 아마 과정의 일부 기능을 다른 기능의 무리를 구현해야 할 것이다. 이 접근법이 얼마나 실현 가능한지 잘 모르겠습니다.
user> (def x (assoc-bidi (make-bidi) :foo :bar))
#'user/x
user> (:foo x)
:bar
user> (getkey x :bar)
:foo
감사합니다. 도움이됩니다. 나는 clojure 네이티브 옵션을 선호하기 때문에 두 번째 아이디어는 내가 시도할만한 것입니다. –