7

次のようなセットをフィルタリングしたいと思います。

(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}))

しかし、私はそれが好きではありません.セットからリストに戻ってセットに戻るのは最適ではないようです. これに対するクロジュリアンの方法は何でしょうか?

アップデート

@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 !
4

1 に答える 1

10

clojure.setは、一般的なセット操作のための便利な API です。

この場合、clojure.set/selectはセット固有のフィルターです。指定されたセットから述語を満たさない要素を分離することによって機能します。

(require 'clojure.set)

(clojure.set/select even? #{1 2 3 4 5})
; => #{2 4} 
于 2013-02-23T17:45:22.057 に答える