在Clojure clojure.set / select vs. clojure.core / filter中过滤一组

时间:2013-02-23 16:57:25

标签: 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和@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 !

1 个答案:

答案 0 :(得分:9)

clojure.set是常用集合操作的便捷API。

在这种情况下,clojure.set/select是特定于集合的过滤器。它的工作原理是分离不符合给定集合谓词的元素。

(require 'clojure.set)

(clojure.set/select even? #{1 2 3 4 5})
; => #{2 4}