2011-01-29 10 views
21

Sto cercando di creare un elenco di caratteri utilizzando una stringa come origine. Ho fatto un po 'di googling e si avvicinò con niente di così poi ho scritto una funzione che ha fatto quello che volevo:Creare un elenco da una stringa in 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))))) 

Ma guardando questo mi fa sentire come Devo mancare un trucco.

  1. C'è una funzione di base o contrib che fa questo per me? Sicuramente sono solo stupido, vero?
  2. Se non c'è un modo per migliorare questo codice?
  3. La stessa cosa funzionerebbe anche per i numeri?

risposta

42

Si può semplicemente utilizzare seguenti funzione per fare questo:

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

per i numeri è possibile utilizzare la soluzione "stupido", qualcosa di simile:

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

P.S. stringhe in clojure sono 'seq'able, in modo da poterli utilizzare come fonte per le funzioni di elaborazione di sequenza - mappa, per, ...

+0

Ciao! Qual è il significato di [^ Personaggio c]? è^Carattere per usare caratteri/cifre all'interno? – Polak

+2

questo è suggerimento tipo, senza di esso il clojure utilizzerà il reflection per determinare il tipo di argomento. Questo rende la funzione leggermente più veloce ... –

17

se si conosce l'ingresso sarà lettere, basta usare

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

per i numeri, provate questo

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

Edit: Oops, pensavi di volere un elenco di diversi caratteri. Per questo, usa la funzione centrale "frequenze".

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

Esempio:

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} 

Poi tutto quello che dovete fare è ottenere le chiavi e li trasformano in una stringa (o non).

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

Grazie. Non volevo ottenere le frequenze, ma ero comunque interessato alla mancia. – robertpostill

Problemi correlati