高效地销毁和比较数据

时间:2018-07-15 12:25:38

标签: clojure

我是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仅次要},如何返回这种类型的值?

1 个答案:

答案 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的子集。