2012-09-20 12 views

Antwort

19

Wenn Sie die truthy Werte halten wollen, müssen nur die identity Funktion verwenden:

(count (filter identity '(1 2 3 nil nil false true))) 
+1

Diese Antwort ist cool! – murtaza52

3

Nur Werte entfernen, die Sie nicht wollen, zu zählen.

(count (remove nil? [1 2 3 nil nil])) => 3 
+1

kleiner Fehler: (count (remove nil? [1 2 3 null null false])) => 4 –

+0

Sie können dieses Problem beheben, indem Sie die 'Null zu ersetzen?' Mit '# (wenn% false true)' –

+2

# (wenn% false true) ist auf die Funktion absolut gleichwertig nicht . (count (remove not [1 2 3 nil nil false])) gibt das korrekte Ergebnis zurück. – animal

2
(defn truthy-count [coll] 
    (reduce + 0 
    (map #(if % 1 0) coll))) 

Obwohl ich zugeben, dass ich Danis Lösung besser gefällt.

2

die genral Muster sind die Sequenz filtern und zählen die Ergebnisse

(count (filter #(if % %) [1 2 3 nil nil false])) 
3 

die #(if % %) ist nur ein kurzer Test für truthyness, die nur ein Element zurück, wenn es truthy oder etwas falsy ist (nil) sonst

+0

Welche Vorteile hat dies, wenn überhaupt, über die '(count (Filter (identity' Ansatz? – noahlz

+0

es ist nur eine andere Art und Weise das Konzept zum Ausdruck von„ wenn dieser Artikel truthy ist“persönlich finde ich es allerdings klar, das ist nur meine Meinung –

6

ich würde empfehlen, dies zu tun reduzieren mit wie folgt:

(defn count-truthy [coll] 
    (reduce (fn [cnt val] (if val (inc cnt) cnt)) 0 coll)) 

Gründe für die auf diese Weise reduzieren mit:

  • Es ist wahrscheinlich, effizienter zu sein, und wird von Clojure des neuen Reduzierungen Funktionalität profitieren, die Tatsache auf
  • viele Sammlungen reduziert ermöglicht
  • Es vermeidet eine Zwischensequenz zu schaffen (das, wenn Sie eine faule Sequenzfunktion wie Filter verwendet passieren würde,)

Wenn Sie bereits eine realisierte Sequenz haben, dann ist die folgende ist auch eine gute Option, da sie von primitiver Arithmetik in der Schleife profitieren:

(defn count-truthy [coll] 
    (loop [s (seq coll) cnt 0] 
    (if s 
     (recur (next s) (if (first s) (inc cnt) cnt)) 
     cnt))) 
Verwandte Themen