Crear una lista de una cadena en Clojure
clojure-contrib (3)
Edición: Vaya, pensé que querías una lista de diferentes personajes. Para eso, usa la función de núcleo "frecuencias".
clojure.core/frequencies
([coll])
Returns a map from distinct items in coll to the number of times they appear.
Ejemplo:
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}
Entonces todo lo que tienes que hacer es obtener las llaves y convertirlas en una cadena (o no).
user=> (apply str (keys (frequencies "lazybrownfox")))
"abflnorwxyz"
Estoy buscando crear una lista de caracteres usando una cadena como mi fuente. Hice un poco de googlear y no encontré nada, entonces escribí una función que hizo lo que quería:
(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)))))
Pero mirar esto me hace sentir que debo faltar un truco.
- ¿Hay alguna función central o contrib que haga esto por mí? Seguramente solo estoy siendo tonto ¿verdad?
- Si no hay una manera de mejorar este código?
- ¿Lo mismo funcionaría para los números también?
Puedes usar la función seq para hacer esto:
user=> (seq "aaa")
(/a /a /a)
para números puedes usar una solución "tonta", algo como:
user=> (map (fn [^Character c] (Character/digit c 10)) (str 12345))
(1 2 3 4 5)
Las cadenas PS en clojure son ''seq'' posibles, por lo que puede usarlas como fuente para cualquier función de procesamiento de secuencias - map, for, ...
Si sabes que la entrada será letras, solo usa
user=> (seq "abc")
(/a /b /c)
para numeros, prueba esto
user=> (map #(Character/getNumericValue %) "123")
(1 2 3)