我想做一些看似类似于替换但执行不同操作的东西 使用replace将创建一个包含所提供索引的相应值的新向量。
example
(replace [10 9 8 7 6] [0 4]) ;;=> [10 6]
我现在的问题是,有没有办法创建一个新的向量,它将排除所提供的索引的相应值?即删除从向量中提供的索引的值。
the code below is just an illustration. "some-function means something needs to be there"
( 'some-function' [10 9 8 7 6] [0 4]) ;;=> [9 8 7]
答案 0 :(得分:1)
我不知道做你想做的本地功能。如果您使用的是Maps,则可以使用dissoc。
您可以编写自己的函数来执行此操作。这是下面的一种方式(很多)。
(defn dissoc-vec
([v ks]
(let [pred (set ks)
replace-keys (->> (range (count v))
(remove #(pred %))
vec)]
(replace v replace-keys))))
答案 1 :(得分:0)
结帐subvec
。
要实现您想要的确切功能,您可以这样做:
(fn [coll [a b]]
(subvec coll (inc a) b))
答案 2 :(得分:0)
您可能需要https://github.com/clojure/core.rrb-vector
[...]
clojure.core.rrb-vector/subvec
,它生成一个包含的新向量 输入向量的适当子范围(与之相反)clojure.core/subvec
,返回输入向量的视图。
答案 3 :(得分:0)
您可以使用以下序列函数执行此操作:
(defn remove-indexes [indexes coll]
(->> coll
(map-indexed vector)
(remove (comp (set indexes) first))
(map second)
vec))
(remove-indexes [0 4] [10 9 8 7 6])
;[9 8 7]
remove
对应。vec
。 传感器版本可能更快一点:
(defn remove-indexes [is v]
(into []
(comp (map-indexed vector)
(remove (comp (set is) first))
(map second))
v))