【问题标题】:Idiomatic clojure question on sequence transformation关于序列转换的惯用 clojure 问题
【发布时间】:2011-01-31 11:33:45
【问题描述】:

我正在学习 Clojure,我需要朝着正确的方向努力解决我提出的这个问题。

我有一系列事件。每个事件都包含一个“日期”。

(def events
  [
   [1509 :marry   "Catherine of Aragon"]
   [1527 :unmarry "Catherine of Aragon"]
   [1533 :marry   "Anne Boleyn"]
   [1536 :unmarry "Anne Boleyn"]
   [1536 :marry   "Jane Seymour"]
   [1537 :unmarry "Jane Seymour"]
   [1540 :marry   "Anne of Cleves"]
   [1540 :unmarry "Anne of Cleves"]
   [1540 :marry   "Catherine Howard"]
   [1542 :unmarry "Catherine Howard"]
   [1543 :marry   "Catherine Parr"]])

我想将其转换为惰性时间线,即每年包含一个向量的序列。从第一个事件的年份开始,一直持续到无穷大。

[[[:marry "Catherine of Aragon"]] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [[:unmarry "Catherine of Aragon"]] [] [] [] [] [] [[:marry "Ane Boleyn"]] [] [] [[:unmarry "Anne Boleyn"] [:marry "Jayne Seymour"]] ...]

【问题讨论】:

标签: clojure


【解决方案1】:
(def timeline
  (let [events-by-year (group-by first events)]
    (map #(map next (events-by-year %))
      (iterate inc (reduce min (keys events-by-year))))))

快速测试:

=> (take 30 timeline)
(((:marry "Catherine of Aragon")) () () () () () () () () () () () () () () () ()
 () ((:unmarry "Catherine of Aragon")) () () () () () ((:marry "Anne Boleyn")) ()
 () ((:unmarry "Anne Boleyn") (:marry "Jane Seymour")) ((:unmarry "Jane Seymour"))
 ())

【讨论】:

    【解决方案2】:

    我建议如下:

    (defn timeline
      ([] (timeline (ffirst *events*) *events*))
      ([time evts]
         (let [[now later] (split-with #(= time (first %)) evts)]
           (cons (map rest now)
                 (lazy-seq (timeline (inc time) later))))))
    

    测试:

    user> (take 30 (timeline))
    (((:marry "Catherine of Aragon")) () () () () () () () () () () () () () () () () () 
     ((:unmarry "Catherine of Aragon")) () () () () () ((:marry "Anne Boleyn")) () () 
     ((:unmarry "Anne Boleyn") (:marry "Jane Seymour")) ((:unmarry "Jane Seymour")) ()) 
    

    我假设事件列表也是无限的 :)

    更新了一些改进,并借鉴了 cgrand 的一些想法(感谢 :)

    【讨论】:

    • 谢谢。当同一日期有多个事件,即 [1515 :c] [1515 :d] 时,它会中断。但是,里面有很多好的建议,所以也许我可以自己解决其余的问题。
    • @GHZ 啊,错过了。好吧,反正 cgrand 的更好 :) 重构,作为第二个选择。
    猜你喜欢
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 2011-11-04
    • 1970-01-01
    • 2011-11-21
    • 2010-11-10
    相关资源
    最近更新 更多