我是Clojure的新手,他尝试使用Clojure中的其他“破坏”功能。 所以我要在这里实现的是,我有两个数据集,如下面的代码片段所示:-Major和minor,
(def result {"Major" { [200 {1 5,2 6, 3 4}] [ 201 {1 5,2 10,4 10,6 10}]}
"Minor" { [ 200 {1 5,2 6,3 4,4 10}] [ 201 {1 5,2 10,3 10}]}})
我要获取未成年人的每个数据集条目,并将其与对应的主要数据集条目进行比较,如果主要数据集条目的值是次要数据集的子集,则从中删除该条目数据集(即主要和次要)。否则将该条目与其他变量(即仅主要和仅次要)相关联。反之亦然。
例如:-
{"Major" { [200 {1 5,2 10, 3 10}] [201 {1 5,2 10,4 10,6 10}] [204 {1 4,2 5,3 8,4 9}]}
"Minor" { [200 {1 5,2 10,3 10,4 10}] [203 {1 5,2 10,3 10}] [204 {1 4,2 5,3 8}]}})
major-only
将为:-{201 value}
(因为在次要成员中不存在),{204 value}
(因为主键的值不是键204的次要值的子集)
minor-only
将是:-{203 value}
(由于在专业语言中不存在),{204 value}
条目(因为子集条件失败)
在解构和比较数据时,我尝试对reduce
执行update-in
,但是无法获得获得预期结果的有效方法。有人可以在这里帮助我吗?
此外,我想返回以下函数的结果:-
{{:major-only
-仅限专业
:minor-only
仅次要},如何返回这种类型的值?
答案 0 :(得分:0)
我不确定您的所有规则对我来说是否完全清楚,但这是您描述的某种功能的实现的刺探。
首先,我将定义一个map-subset?
函数:
(defn map-subset? [m1 m2]
(and (<= (count m1) (count m2))
(every?
(fn [[k v]]
(and (contains? m2 k)
(= (m2 k) v)))
m1)))
这可能与您所说的“子集”完全不同,请随时进行相应调整。
这是您的数据。由于您的问题使用了无效的EDN,因此我删除了地图中成对的方括号,并且我认为这是您的意思:
(def data {"Major" {200 {1 5, 2 10, 3 10}
201 {1 5, 2 10, 4 10, 6 10}
204 {1 4, 2 5, 3 8, 4 9}}
"Minor" {200 {1 5, 2 10, 3 10, 4 10}
203 {1 5, 2 10, 3 10}
204 {1 4, 2 5, 3 8}}})
那么,核心功能相对简单:
(let [{:strs [Major Minor]} data]
{:major-only (into {}
(remove (fn [[k v]]
(map-subset? v (Minor k))))
Major)
:minor-only (into {}
(remove (fn [[k v]]
(map-subset? v (Major k))))
Minor)})
这将重建每个映射,删除其值是另一个映射中相应值的子集的条目:
{:major-only {201 {1 5, 2 10, 4 10, 6 10}
204 {1 4, 2 5, 3 8, 4 9}}
:minor-only {200 {1 5, 2 10, 3 10, 4 10}
203 {1 5, 2 10, 3 10}}}
这会产生与您的示例稍有不同的结果,这就是为什么我不能完全确定我是否理解您的要求的原因,因为从我对地图子集的解释来看,Major的200是Minor的200的子集,而Minor的204是A的子集。 Major的204的子集。