2011-01-17 7 views
26

ich zur Zeit ein Problem habe, wo ich habe eine Textdatei von der Kommandozeile lesen mindestens eine ganze Zahl enthält. Ich lese die Datei und führe einen regulären Ausdruck aus, um Whitespace zu ignorieren.Konvertieren einer Reihe von Strings auf ganze Zahlen (Clojure)

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

Danach habe ich eine ganze Funktion zu schreiben, nur diese Sequenz von Strings in eine Folge von ganzen Zahlen zu konvertieren. Anscheinend kann ich Integer. der Reihenfolge nicht zuordnen (es sei denn, ich verwende Karte falsch).

Gibt es eine elegante Art und Weise der Umgang mit diesem, etwas ähnliches zu kartieren? Oder muss ich rekursiv zuerst abspringen und es auf Integer. umwandeln, um das zu funktionieren?

Ich bin derzeit Lernen Clojure, und als ich Bits lerne Ich gehe zurück und wenig Programmierer Quiz tue ich andere Sprachen abholen verwendet.

Antwort

45

Sie suchen Integer/parseInt.

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

Sie haben Integer/parseInt in einer anonymen Funktion wickeln, da Java-Methoden nicht Funktionen sind.

read-string würde auch in diesem Fall arbeiten:

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

read-string liest jedes Objekt aus einem String, nicht nur ganzen Zahlen. Also, wenn Sie (read-string "1.0") getan hätten, würden Sie ein Doppel zurückbekommen. Beim Lesen von externen Quellen ist es normalerweise besser, das, was gelesen werden kann, auf genau das zu beschränken, was Sie brauchen, was in diesem Fall eine ganze Zahl ist. Daher empfehle ich mein erstes Beispiel zu verwenden.

+0

Ah, das funktioniert! Vielen Dank! –

+2

+1 Hatte keine Ahnung von Lese-String, aber wusste, dass es, wie es etwas sein muss – twneale

+1

Das funktioniert sehr gut, aber nur, wenn Clojure auf der JVM läuft. ClojureCLR ist nicht –

Verwandte Themen