комбинирайте карта и списък от вектори и списъци

Имам две структури от данни:

(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 е нещо подобно, тъй като започва с някои от всички точки от историята на епичния списък и след това слиза надолу на всяка стъпка на итерация броя на точките от историята на своя еп. Итерацията ще бъде над списъка с епоси.


person sveri    schedule 18.02.2014    source източник


Отговори (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})
person noisesmith    schedule 18.02.2014
comment
Това е доста страхотно :-) Не знаех за функцията за намаляване, благодаря ви за това прозрение. - person sveri; 19.02.2014

Не съм запознат с данните на JIRA, но не съм напълно наясно какво трябва да съдържа вашата желана структура от данни. Какви трябва да са x и y?

Като цяло подходът, който бихте предприели, за да комбинирате две или повече структури от данни и да създадете единична структура от данни в различна форма, е да мислите от гледна точка на последователни опростявания. Първо опитайте да обедините двете структури по какъвто и да е начин, който свързва съответните полета на подходящ ключ (намаляване на една или друга структура, предаване на празна карта като първоначална стойност би било добра отправна точка). След като имате една структура от данни във формата, която не искате, прекарайте я през карта или редуцирайте отново, за да получите нещо по-просто. Повтаряйте, докато получите това, което искате. Ако окончателното ви решение е твърде сложно, уверете се, че е тествано и вижте преработването сега, когато работи.

person d11wtq    schedule 18.02.2014
comment
Здравейте, добавих актуализация, която се надявам да направи това по-ясно. Вече се опитах да отида стъпка по стъпка по-близо до решение, но не успях през последните няколко часа, благодаря, че ме мотивирахте отново, ще опитам отново утре :-) - person sveri; 19.02.2014