2014-01-27 24 views
6
的矢量

split-at Clojure的文档指出它需要元素的集合并返回两个的lists一个vector,每个包含元素大于给定的索引更大或更小:拆分的载体到载体的载体中的Clojure而不是列表

(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]] 

这是切成保持元素(如矢量)的顺序两个集合的集合,最好没有性能损失。

通常的做法是什么?是否有任何性能优化的方法来做到这一点?

回答

11

如果你只使用矢量,一个选项是使用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)和非常快的,因为 所得载体股结构与原和没有 修整是完成。

+0

需要修复空向量。它可以找到'split-at' – ClojureMostly

+0

@ClojureMostly它似乎对空向量很好,据我所知:'(= [[] []](split-at'0 []))' –

+0

'split-at'也可以用'(split-at 2 [])' – ClojureMostly

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赞成载体然后你放松懒惰的表现。