31

我正在寻找使用字符串作为源来创建字符列表。我做了一些谷歌搜索并没有想出所以我写了一个函数来做我想要的:

(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. 是否有核心或贡献函数可以为我执行此操作?当然,我只是愚蠢的对吗?
  2. 如果没有,有没有办法改进这段代码?
  3. 同样的事情也适用于数字吗?
4

4 回答 4

51

您可以只使用seq函数来执行此操作:

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

对于数字,您可以使用“哑”解决方案,例如:

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

clojure 中的 PS 字符串是 'seq'able 的,因此您可以将它们用作任何序列处理函数的源 - map、for、...

于 2011-01-29T12:36:16.107 回答
23

如果您知道输入将是字母,只需使用

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

对于数字,试试这个

user=> (map #(Character/getNumericValue %) "123")
(1 2 3)
于 2011-01-29T14:04:32.167 回答
6

编辑:哎呀,以为你想要一个不同字符的列表。为此,请使用核心功能“频率”。

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"
于 2011-01-30T23:27:58.983 回答
0
(apply str (set "lazybrownfox")) => "abflnorwxyz"
于 2019-10-10T18:43:40.293 回答