2013-07-06 26 views
2

我對clojure比較陌生,我不知道什麼是解決以下問題的好方法。使用clojure關鍵字來處理符號

我有兩套符號,說:

V1:

q w e r 

V2:

a s d f 

,他們用來興建第三組

答:

qa qs qd qf 
wa ws wd wf 
ea es ed ef 
ra rs rd rf 

與A的所有元素都是新的符號,但我必須能夠檢索單個符號符號。我想對A進行各種操作,例如,構建A的所有元素組合的另一組合或測試是否相等。

我想出了這兩種解決方案:

解決方案1:

(def A {:qa [:q :a] :qs [:q :s] :qd [:q :d] :qf [:q :f] 
     :wa [:w :a] :ws [:w :s] :wd [:w :d] :wf [:w :f] 
     :ea [:e :a] :es [:e :s] :ed [:e :d] :ef [:e :f] 
     :ra [:r :a] :rs [:r :s] :rd [:r :d] :rf [:r :f]}) 

(defn get-v1 [key] (first (key A))) 

(defn get-v2 [key] (last (key A))) 

=>(get-v1 :qa) 
:q 

溶液2:

(def A [:qa :qs :qd :qf 
     :wa :ws :wd :wf 
     :ea :es :ed :ef 
     :ra :rs :rd :rf]) 

(defn get-v1 [key] (keyword (str (first (name key))))) 

(defn get-v2 [key] (keyword (str (last (name key))))) 

=>(get-v2 :ws) 
:s 

其實解決方案1是不完整的,因爲訂單A的要素也很重要。因此需要解決方案2中的A的定義。但我還沒有想出一個聰明的方式排序,圖式解決方案來創建一個1

問題:

是關鍵字,以正確的方式去?

2. 如果是這樣,是我的解決方案是一個很好的方法來做到這一點或有一個更方便的方法嗎?我傾向於解決方案2.

回答

2

從鍵中派生值是更通用的解決方案。這意味着你可以給它任何鍵,它將返回「適當」值。也就是說,你可以給:xy第二個算法,即使它不包含在A中,它也會嘗試使用它。如果這是一個問題,那麼你的第一個解決方案似乎更好。

至於爲您的第二個解決方案創建一個排序映射,我可能會定義A並從中生成一個排序映射。這可以減少手動複製,同時允許您以更自然的方式提供數據集。 (另外,很容易測試!)

(def A [:qa :qs :qd :qf 
     :wa :ws :wd :wf 
     :ea :es :ed :ef 
     :ra :rs :rd :rf]) 

(defn assoc-v 
    [m k] 
    (let [[a b] (seq (name e))] 
    (assoc m k [(keyword a) (keyword b)]))) 

(defn make-a 
    [elements] 
    (reduce assoc-v (sorted-map) elements)) 
相關問題