删除 Clojure 2D 矢量中的 nil



在Clojure中去除2D矢量中的nils的最佳方法是什么?

[[250 634]] [[450 598] [250 651]] [[450 615] [250 668]] [[450 632] [250 685]] [[450 649] [259 700]] [[450 666] [323 700]] [[450 683] [386 700]] [nil nil] [nil nil] [nil nil] [nil nil] [nil nil] [nil nil] [nil nil]]

如果元素满足给定谓词函数的条件,则可以使用remove从集合中删除元素。现在,您可以使用set作为函数,因此您可以使用 set#{[nil nil]}删除不需要的元素,如下所示:

user=> (def elems [[[250 634]] [[450 598] [250 651]] [[450 615] [250 668]] [[450 632] [250 685]] [[450 649] [259 700]] [[450 666] [323 700]] [[450 683] [386 700]] [nil nil] [nil nil] [nil nil] [nil nil] [nil nil] [nil nil] [nil nil]])
#'user/elems
user=> (remove #{[nil nil]} elems)
([[250 634]] [[450 598] [250 651]] [[450 615] [250 668]] [[450 632] [250 685]] [[450 649] [259 700]] [[450 666] [323 700]] [[450 683] [386 700]])
(filter (fn [x] (every? not-nil x) your-vec)

通过确保子向量不仅充满 nil 来过滤向量。如果你想过滤掉任何带有 nil 的向量,请使用一些而不是每个?。如果你想保留(可能为空的)子向量,那么使用过滤器而不是每一个?

(filter (fn [x] (filter not-nil x) your-vec)

mapv是返回向量的map的变体。以同样的方式,可以定义removev:返回向量的remove变体:

(defn removev [pred v]
(into [] (remove pred v)))

我们可以创建一个谓词,通过将[nil nil]包装在一个集合中来检测:#{[nil nil]}.

通过结合这些,我们得到了我们想要的:

(removev #{[nil nil]} [[1 3] [nil nil] [2 nil]])
=> [[1 3] [2 nil]]

我刚刚注意到这个答案与Denis Fuenzola的答案基本相同,只是这个答案将答案转换回向量。

最新更新