Clojure - 将一个序列拆分为多个序列

Dav*_*vid 2 clojure

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

   (date1 date2 date3 date4 date5 date6 date7)
Run Code Online (Sandbox Code Playgroud)

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

   [(date1 date2) (date3 date4) (date5 date6) (date7)]
Run Code Online (Sandbox Code Playgroud)

到目前为止我的代码如下,但它返回的只是一个包含 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)))))))
Run Code Online (Sandbox Code Playgroud)

我还查看了 split-with 函数,认为当索引除以 x 的模数为零时,我可以使用它来拆分序列,但我对此没有任何运气。

任何帮助将不胜感激。

大卫。

Nie*_*lsK 5

看看split表弟partition

=> (partition-all 2 '(1 2 3 4 5 6 7))
((1 2) (3 4) (5 6) (7))
Run Code Online (Sandbox Code Playgroud)

如果你想进行基于索引的操作,你可以使用map-indexedand keep-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])
Run Code Online (Sandbox Code Playgroud)

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

有几种方法可以在没有索引的情况下以 FP 方式进行分区。Ankur 是一个很好的例子,说明了如果核心 clojure 中没有全部分区,如何解决这个问题。