如何在Clojure中迭代集合的元素,以便我可以在每次迭代中访问前一个,当前值和下一个值。
使用以下向量:
[1 2 3 4]
我希望在每次迭代中都能访问以下值:
[nil 1 2]
[1 2 3]
[2 3 4]
[3 4 nil]
答案 0 :(得分:5)
执行此操作的一种方法是在收集前后concat
ting nil
,并使用3的步长{1}将其partition
。
(def c [1 2 3 4])
(def your-fn println) ;; to print some output later
(map your-fn
(map vec (partition 3 1 (concat [nil] c [nil]))))
(如果元素是LazySeq而不是向量,则可以删除map vec
部分。)
打印哪些:
[nil 1 2]
[1 2 3]
[2 3 4]
[3 4 nil]
答案 1 :(得分:3)
这是一个利用析构函数的loop/recur
实现。
(let [s [1 2 3 4]]
(loop [[prev & [cur nxt :as more]] (cons nil s)
result []]
(if (seq more)
(recur more (conj result [prev cur nxt]))
result)))
答案 2 :(得分:3)
我建议使用分区技术,但另一个技巧是map
对同一序列的交错实例:
(let [s [1 2 3 4]]
(map vector (cons nil s)
s
(concat (drop 1 s) [nil])))
-> ([nil 1 2] [1 2 3] [2 3 4] [3 4 nil])