Function 不带第n个元素的返回向量(第n个元素的补)
我需要从Function 不带第n个元素的返回向量(第n个元素的补),function,vector,clojure,Function,Vector,Clojure,我需要从整数的向量中获取一个随机值 我还需要返回不带value键的向量 下面是示例代码。我知道我可以很容易地将此代码放入函数中以重用 但是想知道是否有一些函数或更好的方法来创建一个没有第n个元素的新的向量?(因此是核心clojure中(n)函数的补充) 矢量数据结构不能有效地删除单个元素。如果您经常这样做,通常应该使用更合适的数据结构。例如,如果向量的元素是不同的,则可以使用集合(或排序集合,如果在其他情况下顺序对您很重要)。或者,如果它们不清楚,但你从不关心顺序,你可以做一个-这里我们使用向量
整数的向量中获取一个随机值
我还需要返回不带value键的向量
下面是示例代码。我知道我可以很容易地将此代码放入函数中
以重用
但是想知道是否有一些函数或更好的方法来创建一个没有第n个元素的新的向量
?(因此是核心clojure中(n)函数的补充)
矢量数据结构不能有效地删除单个元素。如果您经常这样做,通常应该使用更合适的数据结构。例如,如果向量的元素是不同的,则可以使用集合(或排序集合,如果在其他情况下顺序对您很重要)。或者,如果它们不清楚,但你从不关心顺序,你可以做一个-这里我们使用向量,但是避免“从中间移除是昂贵的”问题,在中间用一个元素在末端交换一个,然后从末尾删除。注意@amalloy的建议,但如果您仍然想创建函数,可以执行以下操作
(defn sans-nth [v idx]
"Takes in a vector and an index.
Returns value at index and removes value from vector"
(let [x (get @v idx)
y #(vec (concat (take idx %) (drop (inc idx) %)))]
(swap! v y)
x))
范例
(def v (atom [1 2 3 4 5 6]))
'用户/v
(sans-nth v 3)
四,
[1 2 3 5 6]
如果需要从向量中删除元素
(defn remove-nth [v i]
(vec (concat (take i v) (drop (inc i) v))))
一个类似于向量的更合适的数据结构是。切片和连接是在对数时间内完成的。我没有使用您链接到的函数,但它启发我研究clojure.coreshuffle
函数与first
/rest
组合。谢谢你的洞察力!
@v
(defn remove-nth [v i]
(vec (concat (take i v) (drop (inc i) v))))