我想过滤一组,例如:
(filter-set even? #{1 2 3 4 5})
; => #{2 4}
Run Code Online (Sandbox Code Playgroud)
如果我使用clojure.core/filter我得到一个不是一个集合的seq:
(filter even? #{1 2 3 4 5})
; => (2 4)
Run Code Online (Sandbox Code Playgroud)
所以我带来的最好的是:
(set (filter even? #{1 2 3 4 5}))
Run Code Online (Sandbox Code Playgroud)
但我不喜欢它,从设置到列表回到设置看起来不是最佳.Clojurian的方式是什么?
UPDATE
我做了以下比较@ 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 !
Run Code Online (Sandbox Code Playgroud)
clojure.set是一个用于常见集合操作的便捷API.
在这种情况下,clojure.set/select是一个特定于集的过滤器.它的工作原理是分离不符合给定集合谓词的元素.
(require 'clojure.set)
(clojure.set/select even? #{1 2 3 4 5})
; => #{2 4}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1370 次 |
| 最近记录: |