2011-01-29 63 views
21

我期待创建一个字符串作为我的来源的字符列表。我做了一些谷歌搜索,并没有想出了这样的话,我写一个函数,做了什么,我想:从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))))) 

但看这让我觉得我必须缺少一个把戏。

  1. 是否有核心或贡献功能,为我做到这一点?当然,我只是愚蠢的权利?
  2. 如果没有,有没有一种方法来改善此代码?
  3. 同样的事情对数字也有效吗?

回答

42

你可以使用SEQ功能来做到这一点:

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

的号码,你可以用 “愚蠢” 的解决方案,是这样的:

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

附: Clojure中的字符串是“seq'able,所以你可以把它们作为源,任何序列处理功能 - 地图,为...

+0

嗨! [^字符c]的含义是什么?是^字符内使用字符/数字? – Polak 2016-01-27 22:38:30

+2

这是类型提示,没有它,clojure将使用反射来确定参数类型。这使功能稍快... – 2016-01-28 18:57:06

17

,如果你知道输入将会是字母,只使用

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

数字,试试这个

user=> (map #(Character/getNumericValue %) "123") 
(1 2 3) 
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" 
相关问题