2011-01-29 27 views
21

dizesindeki bir listeden bir liste oluştur Benim kaynağım olarak bir dize kullanarak bir karakter listesi oluşturmak istiyorum. Ben bir hile eksik gerekir gibiClojure

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

Ama bu şu an hissettiriyor: Öyle o zaman ben istediğini yaptım bir fonksiyon yazdım googling biraz yaptım ve hiçbir şey ile geldi.

  1. Bunu benim için yapan bir çekirdek veya katkı işlevi var mı? Şüphesiz ben sadece aptalım haklı mıyım?
  2. Bu kodu iyileştirmenin bir yolu yok mu?
  3. Aynı şey numaralar için de çalışır mı?

cevap

42
Sadece bunu yapmak için DİZ işlevini kullanabilirsiniz

: kullanabileceğiniz numaraları için

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

"aptal" çözüm, gibi bir şey:

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

Not; Clojure içinde dizeleri 'seq'able, bu yüzden herhangi bir sekans işleme fonksiyonları için kaynak olarak kullanabilirsiniz - giriş harfler olacak biliyorsanız sadece kullanmak, ... harita, için

+0

Merhaba! [^ Karakter c] 'nin anlamı nedir? Karakter Karakter/Haneyi kullanmak için karakter mi? – Polak

+2

bu tür ipucu, clojure bağımsız değişken türünü belirlemek için yansıma kullanacaktır. Bu işlevi biraz daha hızlı hale getirir ... –

17

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

numaraları için, bu

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

Edit deneyin: Hata! farklı karakterlerin bir listesini istediğini sanıyordum. Bunun için çekirdek işlevini "frekansları" kullanın.

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

Örnek:

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} 

Sonra yapmanız gereken tek şey anahtarlarını almak ve bir dize haline getirmek (veya değil) olduğunu.

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

Teşekkürler. Frekansları almak istemedim ama bahşiş hiç ilgimi çekmiyordu. – robertpostill