2013-07-06 25 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)) 
相关问题