2013-02-23 5 views
7

を選択し、のようなもの:のClojure clojure.setでフィルターセット/私はセットをフィルタリングしたいと思い対clojure.core /フィルタ

(filter-set even? #{1 2 3 4 5}) 
; => #{2 4} 

私はclojure.core/filterを使用している場合は、私ではない配列を取得しますセット:

(filter even? #{1 2 3 4 5}) 
; => (2 4) 

だから私は付属の最高は次のとおりです。

(set (filter even? #{1 2 3 4 5})) 

しかし、私はそれを好きではない、李にセットから行くために最適な見えません戻って設定する。これのために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 ! 
+2

'clojure.set/select'のパフォーマンスは'(set(filter ...)) 'とほぼ同じでなければなりません。大きなセットのタイミングを取ってみてください。 (1) 'filter'は実際には怠け者であり、(2)Clojureはすべて不変のデータ構造に関するリストなので、新しい構造を作成するという自然な嫌悪感を放棄しなければならないことに注意してください。 –

+0

@A.Webb興味深い、質問の私の更新を見てください。 – Blacksad

答えて

9

clojure.setは、共通セット操作用の便利なAPIです。

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

(require 'clojure.set) 

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

私はclojure.set docでそれを逃したのか分かりません。ありがとう! – Blacksad

関連する問題