Создайте список из строки в Clojure
Я ищу, чтобы создать список символов, используя строку в качестве источника. Я немного поработал с поисковой системой и ничего не придумал, поэтому написал функцию, которая сделала то, что я хотел:
(defn list-from-string [char-string]
(loop [source char-string result ()]
(def result-char (string/take 1 source))
(cond
(empty? source) result
:else (recur (string/drop 1 source) (conj result result-char)))))
Но, глядя на это, я чувствую, что мне не хватает трюка.
- Есть ли функция core или contrib, которая делает это для меня? Наверняка, я просто глупый?
- Если нет способа улучшить этот код?
- Будет ли то же самое работать и для чисел?
Ответы
Ответ 1
Вы можете просто использовать функцию seq для этого:
user=> (seq "aaa")
(\a \a \a)
для чисел вы можете использовать "немое" решение, например:
user=> (map (fn [^Character c] (Character/digit c 10)) (str 12345))
(1 2 3 4 5)
P.S. строки в clojure являются "seq'able", поэтому вы можете использовать их в качестве источника для любых функций обработки последовательности - map, for,...
Ответ 2
если вы знаете, что ввод будет буквой, просто используйте
user=> (seq "abc")
(\a \b \c)
для чисел, попробуйте это
user=> (map #(Character/getNumericValue %) "123")
(1 2 3)
Ответ 3
Изменить: Ой, думал, что вам нужен список разных персонажей. Для этого используйте "частоту" основной функции.
clojure.core/frequencies
([coll])
Returns a map from distinct items in coll to the number of times they appear.
Пример:
user=> (frequencies "lazybrownfox")
{\a 1, \b 1, \f 1, \l 1, \n 1, \o 2, \r 1, \w 1, \x 1, \y 1, \z 1}
Затем все, что вам нужно сделать, это получить ключи и превратить их в строку (или нет).
user=> (apply str (keys (frequencies "lazybrownfox")))
"abflnorwxyz"
Ответ 4
(apply str (set "lazybrownfox")) => "abflnorwxyz"