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.core
shuffle
函数与
first
/
rest
组合。谢谢你的洞察力!
@v
(defn remove-nth [v i]
  (vec (concat (take i v) (drop (inc i) v))))