在Clojure的集合中查找最长字符串的长度

时间:2019-03-03 10:32:29

标签: clojure

这似乎应该很容易上手,但是我却无法弄清楚:如何在Clojure的集合中找到最长字符串的长度?

例如 (fn ["cat", "dog", "bear"]) => 4

2 个答案:

答案 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")