Apache commons'daki koleksiyonlardan biri gibi bunun için her zaman bir Java kitaplığı kullanabilirsiniz. TreeBidiMap, java.util.Map
'u uygular, bu yüzden herhangi bir çaba harcamadan bile yapılabilir. onlar kalıcı koleksiyonları bekliyoruz beri
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")
Bazı şeyler, assoc
ve dissoc
gibi olsa çalışmaz ve TreeBidiMap değişkendir.
Bunu yerel Clojure'da yapmak istiyorsanız, ters yönlü karmayı tutmak için meta verileri kullanabilirsiniz. Bu hala bellek gereksinimlerinizi iki katına çıkaracak ve her ekleme ve silme için zamanı iki katına çıkaracak, ancak aramalar yeterince hızlı olacak ve en azından her şey paketlenecek.
(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))
Elbette, işlevsellikten tam olarak yararlanabilmek için bir dizi başka işlev uygulamak zorunda kalabilirsiniz. Bu yaklaşımın ne kadar uygun olduğundan emin değil.
user> (def x (assoc-bidi (make-bidi) :foo :bar))
#'user/x
user> (:foo x)
:bar
user> (getkey x :bar)
:foo
Teşekkürler, bu yararlı. Bir clojure yerel seçeneğim olmasını tercih ederim, bu yüzden ikinci fikrin deneyebileceğim bir şey. –