使用索引从clojure向量中删除项目

时间:2015-08-06 12:23:42

标签: vector replace clojure

我想做一些看似类似于替换但执行不同操作的东西 使用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]

4 个答案:

答案 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))