我对clojure相对较新,我想知道以下问题的解决方案是什么。
我有两组符号,比如说:
V1:
q w e r
V2:
a s d f
它们用于构建第三组
A:
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中创建排序映射的智能方法。
问题:
1 关键词是正确的方法吗?
2 如果是这样,我的解决方案之一是一个很好的方法,还是有一个更方便的方式?我倾向于解决方案2.
答案 0 :(得分: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))