2

指定された数値 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)))))))

また、x で割ったインデックスの係数がゼロの場合にシーケンスを分割するために使用できると考えて、split-with 関数も調べましたが、これでうまくいきませんでした。

どんな助けでも大歓迎です。

デビッド。

4

2 に答える 2

4

splitのいとこを見てみようpartition

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

map-indexedインデックス ベースの操作を実行する場合は、とを使用できます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])

ただし、FP では、通常、非インデックス ベースの操作がより適切なオプションです。インデックス ベースのソリューションは、コードの匂いと見なすことができます。

インデックスを使用せずに FP 方式でパーティション分割を行う方法はいくつかあります。Ankur は、partition-all がコア clojure に含まれていなかった場合にこれを解決する方法の良い例です。

于 2013-10-17T12:19:24.737 に答える
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))
于 2013-10-17T11:06:10.993 に答える