首先,我假定每个特定结构序列将具有不同的方式来删除项目:载体可以是由索引,列表可以是除去第一个或最后,< EM>集应当使实际项目的删除,等等。

其次,我假定有一些方法用于去除那些结构无关;他们上工作的 SEQ 接口。

由于序列是不可改变的Clojure中,我怀疑你实际上做的是使原来的山寨,只是没了原来的项目。这意味着列表解析可以用于去除,但我怀疑这将是不必要的冗长。

请给的不同的方法来从Clojure的序列中删除项目一些惯用的例子。

有帮助吗?

解决方案

有用于从所有Clojure的数据结构类型的去除可能是因为在不同的性能特性的东西,没有单一的接口。

(disj #{:foo :bar} :foo)       ; => #{:bar}
(dissoc {:foo 1 :bar 2} :foo)  ; => {:bar 2}
(pop [:bar :foo])              ; => [:bar]
(pop (list :foo :bar))         ; => (:bar)

这些也工作(返回一个seq):

(remove #{:foo} #{:foo :bar})      ; => (:bar)
(remove #{:foo} [:foo :bar])       ; => (:bar)
(remove #{:foo} (list :foo :bar))  ; => (:bar)

因为当你迭代的地图,你会得到键/值对这个不适用于哈希映射工作。但这个作品:

(remove (fn [[k v]] (#{:foo} k)) {:foo 1 :bar 2})  ; => ([:bar 2])

其他提示

Clojure的参考序列为的。 filterremove是你追求的是什么。

作为布赖恩卡珀的回答的延伸。这取决于你将与结果做什么。如果你是路过的结果的东西,希望在整个数据集的工作(即打印)是惯用做出序列,并使用过滤器或删除懒洋洋地解决这个问题。如果在另一方面,你要修改的数据结构来保存各种用途以后再创建一个序列上,将失去其良好的更新特性所以在这种情况下,它能够更好地使用特定于数据结构的更新功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top