在Clojure Clojure.set/select与Clojure.core/Filter中筛选集合
我想筛选一组,例如:在Clojure Clojure.set/select与Clojure.core/Filter中筛选集合,clojure,Clojure,我想筛选一组,例如: (filter-set even? #{1 2 3 4 5}) ; => #{2 4} 如果我使用clojure.core/filter我会得到一个非集合的seq: (filter even? #{1 2 3 4 5}) ; => (2 4) 所以我最好的选择是: (set (filter even? #{1 2 3 4 5})) 但我不喜欢它,从一组转到另一组看起来并不理想。Clojurian的方法是什么 更新 我做了以下比较@A.Webb和@Beyam
(filter-set even? #{1 2 3 4 5})
; => #{2 4}
如果我使用clojure.core/filter
我会得到一个非集合的seq:
(filter even? #{1 2 3 4 5})
; => (2 4)
所以我最好的选择是:
(set (filter even? #{1 2 3 4 5}))
但我不喜欢它,从一组转到另一组看起来并不理想。Clojurian的方法是什么
更新
我做了以下比较@A.Webb和@Beyamor的方法。有趣的是,两者的性能几乎相同,但是clojure.set/select
稍好一些
(defn set-bench []
(let [big-set (set (take 1000000 (iterate (fn [x] (int (rand 1000000000))) 1)))]
(time (set (filter even? big-set))) ; "Elapsed time: 422.989 msecs"
(time (clojure.set/select even? big-set))) ; "Elapsed time: 345.287 msecs"
nil) ; don't break my REPL !
是用于常见集合操作的方便API
在这种情况下,是一个特定于集合的过滤器。它的工作原理是将不满足谓词的元素从给定集合中分离出来
(require 'clojure.set)
(clojure.set/select even? #{1 2 3 4 5})
; => #{2 4}
我不知道我怎么会在clojure.set文件中漏掉这个。谢谢值得注意的是,
clojure.set/select
的性能应该与(set(filter…)
大致相同。试着为一个大的集合计时。请记住,(1)filter
实际上并没有创建整个列表,因为它是懒惰的,(2)Clojure完全是关于不可变的数据结构的,所以您必须开始摆脱对创建新结构的自然厌恶。@A.Webb有趣的是,请参阅问题中的我的更新。