Clojure - 将序列拆分成多个序列

时间:2013-10-17 10:47:24

标签: clojure

我正在开发一个函数,它将日期序列(或其他任何内容)拆分为基于给定数字x的向量中包含的多个序列。

   (date1 date2 date3 date4 date5 date6 date7)

因此,给定上面的日期列表并传入变量2,它将生成下面的向量。

   [(date1 date2) (date3 date4) (date5 date6) (date7)]

到目前为止我的代码在下面,但它返回的是一个包含nil的向量。

(defn date-splitter [date-count dates x]
  (loop [i date-count, current-split dates, split-dates (vector)]
        (if (<= i x)
            (conj split-dates (get current-split 1))
            (let [s (split-at x current-split)]
              (recur (int (- i x)) (get s 1) (conj split-dates (get s 0)))))))

我还看了一下split-with函数,认为当索引的模数除以x时我可以用它来分割序列,但是我没有运气。< / p>

非常感谢任何帮助。

大卫。

2 个答案:

答案 0 :(得分:4)

看看split的堂兄partition

=> (partition-all 2 '(1 2 3 4 5 6 7))
((1 2) (3 4) (5 6) (7))

如果您想进行基于索引的操作,可以使用map-indexedkeep-indexed

=> (map-indexed (fn [idx itm] [(Math/floor (/ idx 2)) itm]) [1 2 3 4 5 6 7])
([0.0 1] [0.0 2] [1.0 3] [1.0 4] [2.0 5] [2.0 6] [3.0 7])

在FP中,非基于索引的操作通常是更好的选择。 基于索引的解决方案可以被视为代码嗅觉。

有几种方法可以在没有索引的情况下对FP方式进行分区。 Ankur是如何解决这个问题的一个很好的例子,如果分区 - 所有都不会在核心的clojure中。

答案 1 :(得分:2)

(defn date-splitter [n v]
  (if (not (seq v)) 
      [] 
      (lazy-cat [(take n v)] (date-splitter n (drop n v)))))


user=> (date-splitter 3 [1,2,3,4])
((1 2 3) (4))