2011-01-29 11 views
21

Szukam utworzyć listę znaków za pomocą ciąg jako moje źródło. Zrobiłem trochę googlowania i wymyślił nic więc wtedy napisałem funkcję zrobił to, co chciałem:Utwórz listę z ciągu znaków w 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))))) 

Ale patrząc na to sprawia, że ​​czuję się jak I musi być brakuje trick.

  1. Czy istnieje funkcja rdzeniowa lub contrib, która robi to dla mnie? Na pewno po prostu jestem głupia, prawda?
  2. Jeśli nie, istnieje sposób na ulepszenie tego kodu?
  3. Czy to samo działa również w przypadku numerów?

Odpowiedz

42

można po prostu użyć sekwencję SEQ ID funkcję, aby to zrobić: rozwiązanie "niemy"

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

numerów można użyć, coś jak:

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

PS: struny w Clojure są „seq'able, więc można ich używać jako źródło wszelkich funkcji przetwarzania sekwencji - Mapa, dla ...

+0

Witam! Jakie jest znaczenie [^ Character c]? jest^Postać do wykorzystania Postać/cyfra w środku? – Polak

+2

to podpowiedź typu, bez niej clojure użyje refleksji do określenia typu argumentu. To sprawia, że ​​funkcja jest nieco szybsza ... –

17

jeśli wiesz, że wejście będzie literami, wystarczy użyć

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

numerów, spróbuj tego

user=> (map #(Character/getNumericValue %) "123") 
(1 2 3) 
6

Edit: Ups, że chcesz listę różnych znaków. W tym celu użyj funkcji rdzeniowej "częstotliwości".

clojure.core/frequencies 
([coll]) 
    Returns a map from distinct items in coll to the number of times they appear. 

Przykład:

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} 

Następnie wszystko co musisz zrobić, to dostać klucze i przekształcić je w ciąg znaków (lub nie).

user=> (apply str (keys (frequencies "lazybrownfox"))) 
"abflnorwxyz" 
+0

Dzięki. Nie chciałem zdobywać częstotliwości, ale byłem zainteresowany wskazówką nie mniej. – robertpostill