clojure clojure-contrib

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.

  1. ¿Hay alguna función central o contrib que haga esto por mí? Seguramente solo estoy siendo tonto ¿verdad?
  2. Si no hay una manera de mejorar este código?
  3. ¿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)