7 votes

Filtrer un ensemble en Clojure clojure.set/select vs. clojure.core/filter

Je voudrais filtrer un ensemble, quelque chose comme :

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

Si j'utilise clojure.core/filter J'obtiens une séquence qui n'est pas un ensemble :

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

Donc le mieux que j'ai pu trouver est :

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

Mais je n'aime pas ça, ça n'a pas l'air optimal de passer du plateau à la liste puis au plateau. Quelle serait la méthode Clojurienne pour cela ?

UPDATE

J'ai fait ce qui suit pour comparer les approches de @A.Webb et @Beyamor. Il est intéressant de noter que les deux approches ont des performances presque identiques, mais clojure.set/select est légèrement meilleur.

(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 !

10voto

Beyamor Points 2135

clojure.set est une API pratique pour les opérations courantes sur les ensembles.

Dans ce cas, clojure.set/select est un filtre spécifique à un ensemble. Il fonctionne en dissociant les éléments qui ne répondent pas au prédicat de l'ensemble donné.

(require 'clojure.set)

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X