从Clojure中的集合中删除条目

时间:2018-11-08 16:30:08

标签: collections syntax clojure

我是Clojure的新手,我想知道如何从集合中删除元素。

说我有

(def example ["a" "b" "c"])

我希望能够删除打来的“ b”以及在我打电话时

(println example)

让它返回仅包含“ a”和“ c”的集合

我知道使用(remove (partial = "b") example) 会返回我想要的东西,但是那我该如何更新示例变量呢?

谢谢!

3 个答案:

答案 0 :(得分:1)

(filter (fn [x] (not (= x "b"))) example)

会让您'("a" "c")。几点:

  1. 您不应该考虑突变。总体上使用函数式编程尤其是使用Clojure及其持久性数据结构的全部目的是避免与可变性相关的问题。
  2. 如果真的,确实需要使原子可变的东西,您可以使用原子,但是如果您不确定,则需要使原子可变,那么您不需要t。

答案 1 :(得分:0)

首先,首先检查您是否真的需要突变。 Clojure是围绕处理不可变数据而设计的-有可能在不更改适当值的情况下实现您最终想要做的事情。

如果您需要可变的数据,则可以为此创建一个原子-更改汽车的价值通常是一种不好的做法。

(def example (atom ["a" "b" "c"]))

(println @example) ;; ["a" "b" "c"]

(swap! example #(remove (partial = "b") %))

(println @example) ;; ["a" "c"]

答案 2 :(得分:0)

Clojure的默认数据结构是不可变的。因此,您不能就地更改矢量,但是可以使用所需元素创建一个新矢量。

在函数上下文中,这是使用remove的方法:

(defn my-func [col]
  (let [without-b (remove #(= "b" %) col)]
     (println without-b)
     ; do something else w/ without-b
  ))
...
 => (my-func ["a" "b" "c"])
 (a c)

这是处理集合的惯用Clojure方法,即您从旧集合创建新集合。这没有“显着”的内存或性能影响,因为数据结构是在基于树的数据结构Tries上实现的,您可以在此处了解更多信息: https://hypirion.com/musings/understanding-persistent-vector-pt-1