web-dev-qa-db-ja.com

文字列のシーケンスを整数に変換する(Clojure)

現在、少なくとも1つの整数を含むテキストファイルをコマンドラインから読み取らなければならないという問題があります。私はファイルを読んでいて、空白を無視するために正規表現の一致を行っています。

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

この後、この文字列のシーケンスを整数のシーケンスに変換するためだけに、関数全体を作成する必要があります。どうやら私はInteger.をシーケンスにマップすることができません(マップを間違って使用していない限り)。

マップに似た、これを処理するエレガントな方法はありますか?それとも、これを機能させるために、最初に再帰的にポップオフしてInteger.にキャストする必要がありますか?

私は現在Clojureを学んでいます。少し学んだら、戻って、他の言語を習得するために使用した小さなプログラマークイズを行っています。

27
Justin Hamilton

あなたはInteger/parseIntを探しています。

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

Javaメソッドは関数ではないため、Integer/parseIntを無名関数でラップする必要があります。

この場合、read-stringも機能します。

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

read-stringは、整数だけでなく、文字列からanyオブジェクトを読み取ります。したがって、(read-string "1.0")を実行すると、2倍になります。外部ソースから読み取る場合は、通常、読み取ることができるものを必要なもの(この場合は整数)に制限することをお勧めします。したがって、最初の例を使用することをお勧めします。

46
Rayne