2011-01-29 61 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"