结合地图和矢量和列表列表

时间:2014-02-18 21:37:55

标签: list vector map clojure

我有两个数据结构:

(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 类似于它从史诗列表的所有故事点开始,然后在每个迭代步骤中记录其史诗的故事点的数量。 迭代将在史诗列表上。

2 个答案:

答案 0 :(得分:2)

我使用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})

答案 1 :(得分:0)

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

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