首页 > 解决方案 > 向量中的单个重复项

问题描述

给定一个从 1 到 10 且大小为 5 的整数列表,如何检查列表中是否只有 2 个相同的整数?

例如

(check '(2 2 4 5 7)) 

产生是的,而

(check '(2 1 4 4 4)) 

或者

(check '(1 2 3 4 5))

产量不

标签: clojure

解决方案


这是一个解决方案,使用频率来计算出现次数并过滤以计算仅出现两次的值的数量:

(defn only-one-pair? [coll]
  (->> coll
       frequencies                ; map with counts of each value in coll
       (filter #(= (second %) 2)) ; Keep values that have 2 occurrences
       count                      ; number of unique values with only 2 occurrences
       (= 1)))                    ; true if only one unique val in coll with 2 occurrences

这使:

user=> (only-one-pair? '(2 1 4 4 4))
false
user=> (only-one-pair? '(2 2 4 5 7))
true
user=> (only-one-pair? '(1 2 3 4 5))
false

函数中的中间步骤以了解其工作原理:

user=> (->> '(2 2 4 5 7) frequencies)
{2 2, 4 1, 5 1, 7 1}
user=> (->> '(2 2 4 5 7) frequencies (filter #(= (second %) 2)))
([2 2])
user=> (->> '(2 2 4 5 7) frequencies (filter #(= (second %) 2)) count)
1

根据建议,该函数可以使用更具描述性的名称,最好的做法是给谓词函数一个 ? 在 Clojure 的最后。所以也许只有一对?总比检查好。


推荐阅读