重複の可能性:
マップ操作の結果として真の値のみを返す方法
偽りの値と真実の値を持つコレクションがあります。正しい値のみをカウントしたいのですが、それを行う方法はありますか?
(count (1 2 3 nil nil)) => 5
重複の可能性:
マップ操作の結果として真の値のみを返す方法
偽りの値と真実の値を持つコレクションがあります。正しい値のみをカウントしたいのですが、それを行う方法はありますか?
(count (1 2 3 nil nil)) => 5
真の値を保持したい場合は、次のidentity
関数を使用する必要があります。
(count (filter identity '(1 2 3 nil nil false true)))
次のように reduce を使用してこれを行うことをお勧めします。
(defn count-truthy [coll]
(reduce (fn [cnt val] (if val (inc cnt) cnt)) 0 coll))
reduce をこのように使用する理由:
実現されたシーケンスが既にある場合は、次の方法も適切なオプションです。これは、ループ内のプリミティブ演算の恩恵を受けるためです。
(defn count-truthy [coll]
(loop [s (seq coll) cnt 0]
(if s
(recur (next s) (if (first s) (inc cnt) cnt))
cnt)))
カウントしたくない値を削除するだけです。
(count (remove nil? [1 2 3 nil nil])) => 3
一般的なパターンは、シーケンスをフィルタリングし、結果をカウントします
(count (filter #(if % %) [1 2 3 nil nil false]))
3
これ#(if % %)
は真実性の簡単なテストであり、それが真実であるか何か偽物である場合にのみアイテムを返します(nil)それ以外の場合
(defn truthy-count [coll]
(reduce + 0
(map #(if % 1 0) coll)))
私はdAniのソリューションの方が好きだと認めますが。