在clojure而不是列表矢量中将矢量分成矢量矢量

时间:2014-01-27 09:16:34

标签: clojure

split-at的clojure文档声明它需要一组元素并返回两个vector lists,每个{{3}}包含大于或小于给定索引的元素:

(split-at 2 [1 2 3 4 5])
[(1 2) (3 4 5)]

我想要的是:

(split-at' 2 [1 2 3 4 5])
[[1 2] [3 4 5]]

这是一个集合,分为两个集合,保持元素的顺序(如向量),最好没有性能损失。

执行此操作的常用方法是什么,是否有任何性能优化方法可以执行此操作?

2 个答案:

答案 0 :(得分:12)

如果您只使用向量,则可以使用subvec

(defn split-at' [idx v]
    [(subvec v 0 idx) (subvec v idx)])

(split-at' 2 [1 2 3 4 5])
;; => [[1 2] [3 4 5]]

关于绩效,subvec状态的文档:

  

此操作为O(1)且非常快,如   生成的向量与原始的共享结构,没有   修剪完成。

答案 1 :(得分:2)

为什么不用“vec”功能扩展核心功能?

所以基于拆分定义:

(defn split-at
  "Returns a vector of [(take n coll) (drop n coll)]"
  {:added "1.0"
   :static true}
  [n coll]
    [(take n coll) (drop n coll)])

我们可以向矢量结果的每个元素添加vec

(defn split-at-vec
  [n coll]
    [(vec (take n coll)) (vec (drop n coll))])

发布“性能惩罚”我认为当你改变懒惰的seqs而转向矢量时,你会失去懒惰的表现。