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]]
这是一个集合,分为两个集合,保持元素的顺序(如向量),最好没有性能损失。
执行此操作的常用方法是什么,是否有任何性能优化方法可以执行此操作?
答案 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而转向矢量时,你会失去懒惰的表现。