2013-10-17 92 views
1

我正在研究一個函數,該函數將一個日期(或任何其他)序列分成一個基於給定數x的向量中包含的多個序列。Clojure - 將一個序列分成多個序列

(date1 date2 date3 date4 date5 date6 date7) 

因此,給定上面的日期列表並傳入變量2,它將生成下面的向量。

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

我到目前爲止的代碼是在下面,但它返回的是一個包含零的向量。

(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))))))) 

我也看了一下分裂與功能,以爲我可以用它來分割序列當索引除以x模數是零,但我沒有任何運氣有了這個。

任何幫助將不勝感激。

David。

回答

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's是如何解決這個問題的一個很好的例子 - 如果分區都不在覈心clojure中的話。

+0

這是一個更簡單的方法。謝謝。 – David

1
(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)) 
+0

'split-at' FTW! –