2011-12-08 16 views
6

Puedo leer algunos datos de esta manera en la respuesta. Para un programa real que planeo asignar de una forma especial.¿Cómo convertir una cadena de números clojure en enteros separados?

(def x1 (line-seq (BufferedReader. (StringReader. x1)))) 

Si entro 5 5, X1 está obligado a ("5 5")

me gustaría convertir esta lista de un elemento en una lista de dos números enteros. ¿Cómo puedo hacer eso? He estado jugando con el análisis de la secuencia en espacios en blanco, pero estoy teniendo problemas para realizar la conversión a un número entero.

Respuesta

6

¿Esto es útil? En Clojure 1.3.0:

(use ['clojure.string :only '(split)]) 
(defn str-to-ints 
    [string] 
    (map #(Integer/parseInt %) 
     (split string #" "))) 
(str-to-ints "5 4") 
; => (5 4) 
(apply str-to-ints '("5 4")) 
; => (5 4) 

En el caso de la versión Clojure que está utilizando no tiene clojure.string espacio de nombres se puede omitir el comando use y definir la función en un siguiente manera.

(defn str-to-ints 
    [string] 
    (map #(Integer/parseInt %) 
     (.split #" " string))) 

Usted puede deshacerse de las expresiones regulares mediante el uso de (.split string " ") en la última línea.

+0

Debe ser '(.split cadena # " ")' por supuesto :) –

+2

@googolplex, '(.split cadena"")' realidad. Gracias por señalarlo, he revisado la respuesta. – Jan

+0

Gracias. Integró dos pasos, lo que explica por qué recibí un error sobre la conversión de caracteres y otro sobre la conversión de cadena a char. Voy a probar esto para asegurarme. – octopusgrabbus

3

Obras para todos los números y devuelve nil en el caso de que no es un número (para que pueda filtrar Nils en la SEC resultante)

(require '[clojure.string :as string]) 

(defn parse-number 
    "Reads a number from a string. Returns nil if not a number." 
    [s] 
    (if (re-find #"^-?\d+\.?\d*$" s) 
    (read-string s))) 

por ejemplo,

(map parse-number (string/split "1 2 3 78 90 -12 0.078" #"\s+")) 
; => (1 2 3 78 90 -12 0.078) 
Cuestiones relacionadas