如何迭代集合并在每次迭代时访问上一个,当前值和下一个值?

时间:2017-01-29 17:59:39

标签: clojure

如何在Clojure中迭代集合的元素,以便我可以在每次迭代中访问前一个,当前值和下一个值。

使用以下向量:

[1 2 3 4]

我希望在每次迭代中都能访问以下值:

[nil 1 2]
[1 2 3]
[2 3 4]
[3 4 nil]

3 个答案:

答案 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])