【问题标题】:combine map and list of vectors and lists结合地图和向量列表和列表
【发布时间】:2014-02-18 21:37:54
【问题描述】:

我有两个数据结构:

(def epics {"ARP-37" 8.0, "ARP-24" 5.0, "ARP-22" 13.0, "ARP-6" 21.0, "ARP-1" 8.0})
(def releases '(["Release one" '("ARP-37" "ARP-22" "ARP-6")]))
; gets the sum of a list of epics (maps epic keys to its corresponding story points)
(defn get-max-sp [epic-list] (reduce + (map #(get epics %) epic-list)))
(def initial-sp (get-max-sp '("ARP-37" "ARP-22" "ARP-6")))

有些人可能会认为这是 JIRA 数据。但是,我想将这两种结构组合起来,如下所示:

; where (now) is a function from clj-time returning the current date
(def result [{x: (now), y: initial-sp }
             {x: (+ now (get epics "ARP-37")), y: (- initial-sp (get epics "ARP-37))}
             {x: (+ now (get epics "ARP-37") (get epics "ARP-22")), 
                  y: (- initial-sp (get epics "ARP-37") (get epics "ARP-22"))}
             {x: (+ now (get epics "ARP-37") (get epics "ARP-22")
                     (get epics "ARP-6")), 
                  y: (- initial-sp (get epics "ARP-37") (get epics "ARP-22")
                       (get epics "ARP-6") )}
            ])

所以,在执行完函数后,我希望结果如下所示:

[{x: 2014-02-18, y: 42}
 {x: 2014-02-26, y: 34}
 {x: 2014-03-11, y: 21}
 {x: 2014-04-01, y: 0}
 ]

我在组合和映射这两个结构以获得我的结果时遇到了麻烦,我很想获得一些关于如何在 clojure 中解决该问题的提示:-)

谢谢, 斯文

更新:由于似乎不清楚 x 和 y 应该是什么,我将尝试对它们进行更多解释。 x 应该是一个初始值为今天的日期,并且在每个迭代步骤中都会添加一个史诗的故事点“ARP-37”是史诗,8.0 是它的故事点。 y 是类似的,因为它从史诗列表的所有故事点开始,然后在每个迭代步骤中下降其史诗的故事点数。 迭代将超过史诗列表。

【问题讨论】:

    标签: list vector map clojure


    【解决方案1】:

    我使用reductions 来获取累积值,因为我们会减少您的输入。

    输入来自使用 map 的史诗列表。

    我使用一些简单的类型转换来获得正确的增量和输出类型。

    (let [add-days (fn [d days]
                     (java.util.Date. (long (+ (.getTime d)
                                               (* 1000 60 60 24 days)))))
          initial {:x (java.util.Date.)
                   :y 42}
          our-epics ["ARP-37" "ARP-22" "ARP-6"]]
      (reductions (fn [tally epic-n]
                    {:x (add-days (:x tally) epic-n)
                     :y (long (- (:y tally) epic-n))})
                  initial
                  (map #(get epics %)
                       our-epics)))
    
    ({:x #inst "2014-02-18T22:31:17.027-00:00", :y 42}
     {:x #inst "2014-02-26T22:31:17.027-00:00", :y 34}
     {:x #inst "2014-03-11T22:31:17.027-00:00", :y 21}
     {:x #inst "2014-04-01T22:31:17.027-00:00", :y 0})
    

    【讨论】:

    • 太棒了 :-) 我不知道缩减功能,谢谢你的洞察力。
    【解决方案2】:

    我不熟悉 JIRA 数据,但我并不完全清楚您想要的数据结构应该包含什么。 x 和 y 应该是什么?

    一般而言,将两个或多个数据结构组合起来并生成不同形状的单个数据结构的方法是从连续简化的角度来考虑。首先尝试以任何方式合并这两个结构,将相关字段关联到合适的键上(对一个或另一个结构进行归约,传入一个空映射作为初始值将是一个很好的起点)。一旦你有一个你不想要的形状的数据结构,通过一个 map 或 reduce 再次传递它以获得更简单的东西。重复直到你得到你想要的。如果您的最终解决方案过于复杂,请确保它已经过测试,并在它工作后考虑重构。

    【讨论】:

    • 嗨,我添加了一个更新,希望能更清楚地说明这一点。我已经尝试一步一步接近解决方案,但在过去的几个小时里失败了,谢谢你再次激励我,我明天再试一次:-)
    猜你喜欢
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2021-01-07
    • 2018-07-25
    • 2018-11-07
    • 1970-01-01
    相关资源
    最近更新 更多