Существует множество способов реализовать это, используя большое количество функций в базовой библиотеке Clojure. Это одна из распространенных проблем, возникающих с каждым новым разработчиком, приходящим в Clojure: вы думаете, что вам нужно написать функцию самостоятельно, но на самом деле что-то уже существует, просто вы еще не знаете ее имя, поэтому Шпаргалка Clojure может пригодиться.
Давайте начнем со строки aabbce
. Вы хотите удалить дубликаты, поэтому (set "aabbce")
будет читать строку как набор символов и создавать из них набор. Вы можете использовать функцию map
, чтобы взять каждый символ и превратить его в ключевое слово. Проблема в том, что функция keyword
принимает строку, а не символ, поэтому нам нужно сначала использовать str
для каждого символа.
Когда у нас есть последовательность ключевых слов, один из простых способов построения карты - использование функции frequencies
, она создаст хэш-карту каждого элемента в коллекции ключевых слов с ключевым словом в качестве ключа, и Сколько раз оно появляется в коллекции как значение, и поскольку мы уже удалили дубликаты, мы гарантируем, что каждое значение будет просто 1
.
Собираем все вместе:
(defn is-valid? [s]
(frequencies
(map (comp keyword str) ;; Turns \a into :a for every letter in the set
(set s)))) ;; remove duplicates, yields: (\a, \b, \c, \e)
;; or, using the ->> macro:
(defn is-valid? [s]
(->> (set s) ;; turn string into set of chars
(map (comp keyword str)) ;; turn chars into keywords
frequencies)) ;; compute occurrences hash-map
;; (println (is-valid? "aabbce"))
;; => {:a 1, :b 1, :c 1, :e 1}
Теперь имя isValid предполагает, что вы хотите использовать эту функцию в качестве предиката (например, return true
или false
в зависимости от ввода). Может быть, хотите построить функцию, которая проверяет, состоит ли строка из определенных букв?