这似乎应该很容易上手,但是我却无法弄清楚:如何在Clojure的集合中找到最长字符串的长度?
例如 (fn ["cat", "dog", "bear"]) => 4
答案 0 :(得分:2)
user=> ((fn [strs] (apply max (map count strs))) ["cat" "dog" "bear"])
4
答案 1 :(得分:2)
(max (count coll))
对集合进行计数,该集合返回3,然后取3中的max
(无)得到3。这不是您想要的。
(apply max count coll)
导致(max count "cat" "dog" "bear")
导致将符号和字符串与max
进行比较,并且由于max
需要一个或多个数字而引发异常。
(fn ["cat", "dog", "bear"])
无效的语法,并导致fn
不符合规范的异常。特殊形式fn
将符号向量(绑定形式)(或者可选地将名称作为名称向量,将第三个参数作为绑定形式)作为第一个参数。例如,(fn ident [n] n))
是具有名称ident的函数,该函数接受参数n
并返回n
,((fn [n] n) 1) ;; => 1
。
因此请牢记这些,一种方法是首先确定coll
中元素的数量,然后找到该列的max
。
(def coll ["cat" "dog" "bear"])
(如果不需要重复项,则使用一组#{"cat" "dog" "bear"}
)
有几种方法可以做到这一点:
(apply max (map count coll)) ;; => 4
将计数转换为计数[3 3 4]
和apply max
的集合即可得到(max 3 3 4)
。
(reduce max (map count coll)) ;; => 4
与上面相同,但是通过仅使用第一个元素的max
,然后使用具有先前结果的max
的第二个元素来减少集合,依此类推。
根据您的需要,您可以执行以下操作:
(group-by count coll) ;; => {3 ["cat" "dog"], 4 ["bear"]}
(sort-by count ["a" "aa" "aaa" "aa" "aaaaa" "a"]) ;; => ("a" "a" "aa" "aa" "aaa" "aaaaa")