Найти длину самой длинной строки в коллекции в Clojure - PullRequest
0 голосов
/ 03 марта 2019

Кажется, что это должно быть комично легко, но я почему-то не могу понять: как найти длину самой длинной строки в коллекции в Clojure?

например (fn ["cat", "dog", "bear"]) => 4

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

(max (count coll)) считает коллекцию, которая возвращает 3, а затем взятие max из 3 (и ничего) приводит к 3. Это не то, что вы хотите.

(apply max count coll) приводит к(max count "cat" "dog" "bear"), который приводит к сравнению символа и строк с max, и это вызывает исключение, потому что max ожидает одно или несколько чисел.

(fn ["cat", "dog", "bear"]) не является допустимым синтаксисом и приводит к исключению, котороеfn не соответствует спецификации.Специальная форма fn принимает в качестве первого аргумента вектор символов (binding-form) (или, необязательно, имя и, в качестве третьего аргумента, связывающую форму)Например, (fn ident [n] n)) - это функция с именем идентификатора, которая принимает аргумент 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")

0 голосов
/ 03 марта 2019
user=> ((fn [strs] (apply max (map count strs))) ["cat" "dog" "bear"])
4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...