Создать список из строки в Clojure - PullRequest
24 голосов
/ 29 января 2011

Я ищу, чтобы создать список символов, используя строку в качестве моего источника. Я немного погуглил и ничего не придумал, поэтому я написал функцию, которая делала то, что хотел:

(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)))))

Но, глядя на это, я чувствую, что, должно быть, мне не хватает трюка.

  1. Есть ли функция core или contrib, которая делает это для меня? Конечно, я просто тупой, верно?
  2. Если нет способа улучшить этот код?
  3. Будет ли то же самое работать и с числами?

Ответы [ 3 ]

46 голосов
/ 29 января 2011

Вы можете просто использовать функцию seq , чтобы сделать это:

user=> (seq "aaa")
(\a \a \a)

для чисел, которые вы можете использовать "тупое" решение, что-то вроде:

user=> (map (fn [^Character c] (Character/digit c 10)) (str 12345))
(1 2 3 4 5)

Строки PS в clojure являются «seq'able», так что вы можете использовать их в качестве источника для любых функций обработки последовательности - map, for, ...

17 голосов
/ 29 января 2011

если вы знаете, что ввод будет состоять из букв, просто используйте

user=> (seq "abc")
(\a \b \c)

для чисел, попробуйте это

user=> (map #(Character/getNumericValue %) "123")
(1 2 3)
6 голосов
/ 31 января 2011

Редактировать: К сожалению, вы хотели список различных символов.Для этого используйте базовую функцию «частоты».

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"
...