我需要从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})
答案 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))))