没有第n个元素的返回向量(第(nth)个补码)

时间:2014-03-09 19:35:59

标签: function vector clojure

我需要从vector integers获取随机值。

我还需要在没有值键的情况下取回vector

示例代码如下。我知道我可以轻松地将此代码放在function中以便重用。

但是想知道是否有一些函数或更好的方法来创建没有第n个元素的新vector? (因此核心clojure中第(nth)function的补充)

(let [ vector [1 2 3 5 9 1]
       id (rand-int (count vector))
       value (nth vector id)
       head (take id vector)
       tail (drop (+ id 1) vector)
       vector (flatten [head tail])]
  {:value value :new-vector vector})

2 个答案:

答案 0 :(得分:5)

矢量数据结构不能有效地移除单个元素。如果您经常这样做,通常应该使用更合适的数据结构。例如,如果向量的元素是不同的,则可以使用集合(或排序集,如果在其他情况下顺序对您很重要)。或者如果它们不是明显的,但你从不关心秩序,你可以做一个Fisher-Yates shuffle - 这里我们使用一个向量,但避免“从中间删除是昂贵的”问题,通过交换中间的一个最后的元素,然后从末尾删除。

答案 1 :(得分:2)

听取@ 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]))

“用户/体积

(sans-nth v 3)

4

@v

[1 2 3 5 6]

如果您只需要从矢量中删除元素

(defn remove-nth [v i]
  (vec (concat (take i v) (drop (inc i) v))))