【问题标题】:Delete an item from a clojure vector using index使用索引从 clojure 向量中删除项目
【发布时间】:2015-08-06 12:23:42
【问题描述】:

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

【问题讨论】:

  • 您是否像某些答案所暗示的那样,删除了始终由两个索引给出的 子范围?或者,正如其他人所假设的那样,您是否提供了一系列任意数量的索引来删除它们的值?

标签: vector replace clojure


【解决方案1】:

我不知道有什么本机函数可以满足您的需求。如果您使用的是地图,则可以使用 dissoc。

您可以编写自己的函数来执行此操作。下面是一种(多种)方法。

(defn dissoc-vec
  ([v ks]
    (let [pred (set ks)
          replace-keys (->> (range (count v))
                            (remove #(pred %))
                            vec)]
      (replace v replace-keys))))

【讨论】:

  • 请注意,这需要线性时间,而 dissoc 是一个几乎恒定的时间操作。
  • 这需要线性时间,因为向量数据结构没有办法支持快速索引删除。
  • 你的(remove #(pred %)) 只是(remove pred),正如@amalloy 曾经向我指出的那样:)。
【解决方案2】:

查看subvec。

要实现您想要的确切功能,您可以这样做:

(fn [coll [a b]]
  (subvec coll (inc a) b))

【讨论】:

  • 请注意,subvec 返回的向量仅返回输入向量的视图,因此不会对输入向量进行垃圾回收。
  • 此外,如果没有它在内部复制原始向量,您也无法有效地将元素组合回子向量。
  • @amalloy 你有参考吗?
【解决方案3】:

你可能需要https://github.com/clojure/core.rrb-vector

[...]clojure.core.rrb-vector/subvec,它产生一个新的向量,包含 输入向量的适当子范围(与 clojure.core/subvec,返回输入向量的视图)。

【讨论】:

    【解决方案4】:

    您可以使用以下序列函数执行此操作:

    (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))
    

    【讨论】:

      猜你喜欢
      • 2016-08-14
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      相关资源
      最近更新 更多