2009-10-23 25 views

cevap

17

Yapı eşlemelerini kullanabilirsiniz. birini tanımlamak için:

(struct-map bintree :left nil :right nil :key 0) 

Sonra böyle bir yapı içinde değerleri erişebilir:

(defstruct bintree :left :right :key) 

bir örneğini yapmak için

(:left tree) 

vb

Yoksa yeni erişim fonksiyonları oluşturabilir:

(def left-branch (accessor bintree :left)) 

ve kullanmak:

(left-branch tree) 
+0

Bu nasıl iç içe geçmiş bir liste veya vektör kullanmaktan daha iyidir? – Zaz

+1

Anahtarlar adlandırıldığı ve sabit zamanlı erişim garantisine sahip oldukları için daha iyi olur (listeler vektörler sabit olsa da doğrusal erişimdir). Bu, 2009 yılında yazıldı ve o zamandan beri çok şey değişti. Ben sadece 'defstruct' öneriyordum çünkü soru şemanın 'yapı-yapısı' ile ilgiliydi. –

1

Clojure'u bilmiyorum, ama bahse girerim, define-struct olmadan şemada yaptığınız gibi ... sadece sol ve sağ dalları bir araya getirir. Bir şey bulmak için, bir atomu vurana kadar nüks edin.

Gerçekten de, structmaps istediğiniz gibi geliyor. this page'u buldum. Aşağıya doğru aşağıya doğru yapı haritalarını arayın.

1

basit şekilde olacaktır zaten (her sıralanmış haritası gerçekten bir ağaç dilde tanımlanan ağacını kullanmak için, sadece anahtarlarını karşılaştırmak için farklı işlev gerekirse, sıralanmış-harita-kullanarak).

;;define function for comparing keys 
(defn compare-key-fn [key1 key2] (< key1 key2)) 

;;define tree and add elements 
(def my-tree 
    (->        ;;syntax sugar 
    (sorted-map-by compare-key-fn) ;;this returns empty tree with given function to compare keys 
    (assoc 100 "data for key = 100") ;;below we add elements to tree 
    (assoc 2 "data for key = 2") 
    (assoc 10 "data for key = 10") 
    (assoc -2 "data for key = -1"))) 

;;accesing elements by key 
(prn "element for key 100 =" (my-tree 100)) 

;;"erasing" elements from tree - in reality, what we are really doing, is returning a new tree that contains all elements of the old one, except the element we've just erased. 
(def my-new-tree 
    (dissoc my-tree 2)) 

(prn my-new-tree) ;; to verify, that element 2 is "erased" 
+1

Sıralanmamış mı? Bunun daha iyi bir uyum olacağını düşünüyorum ve anahtar depoladığınız yapıların bir parçası olabilir. Sıralı harita, anahtarı ayırmanızı ve sonsuza dek ayrı ayrı ele almanızı zorlaştırır. –

+0

+1 yine de, ne söyleyebildiğime yakın, sorulduğu zaman soruyu tekrar görmüştüm. –

İlgili konular