2011-01-17 20 views
26

Attualmente sto avendo un problema in cui devo leggere un file di testo dalla riga di comando che contiene almeno un numero intero. Sto leggendo il file, facendo una corrispondenza di espressioni regolari per ignorare gli spazi bianchi.Convertire una sequenza di stringhe in numeri interi (Clojure)

(re-seq #"[0-9]+" (slurp (first *command-line-args*))) 

Dopo questo, devo scrivere un'intera funzione solo per convertire questa sequenza di stringhe in una sequenza di numeri interi. Apparentemente non riesco a mappare Integer. nella sequenza (a meno che non utilizzi la mappa in modo errato).

C'è un modo elegante di gestire questo, qualcosa di simile alla mappa? O devo passare ricorsivamente prima di ricominciare e gettarlo a Integer. per farlo funzionare?

Attualmente sto imparando Clojure e, mentre imparo bit, torno indietro e faccio piccoli quiz di programmatore che ho usato per imparare altre lingue.

risposta

45

Stai cercando Integer/parseInt.

user=> (map #(Integer/parseInt %) ["1" "2" "3" "4"]) 
(1 2 3 4) 

dovete avvolgere Integer/parseInt in una funzione anonima perché i metodi Java non sono funzioni.

read-string sarebbe anche lavorare in questo caso:

user=> (map read-string ["1" "2" "3" "4"]) 
(1 2 3 4) 

read-string legge qualsiasi oggetto da una stringa, non solo numeri interi. Quindi, se lo facessi, (read-string "1.0"), verrai indietro di un doppio. Quando leggi da fonti esterne, di solito è meglio limitare ciò che può essere letto esattamente a ciò di cui hai bisogno, che è un numero intero in questo caso. Pertanto, consiglio di utilizzare il mio primo esempio.

+0

Ah, funziona! Grazie! –

+2

+1 Non avevo idea di read-string, ma sapeva che doveva esserci qualcosa di simile. – twneale

+1

Funziona molto bene, ma solo quando Clojure è in esecuzione sulla JVM. ClojureCLR non è –

Problemi correlati