2011-12-08 19 views
6

Bu gibi bazı verileri okuyabilirim. Gerçek bir program için özel bir formda atamayı planlıyorum. Ben 5 5 girersenizBir clojure sayı dizisini ayrı tam sayılara nasıl dönüştürebilirim?

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

, x1 ("5 5") bağlı olduğu

iki tamsayılar bir liste halinde bir elementin bu listeyi dönüştürmek istiyoruz. Bunu nasıl yapabilirim? Dizideki boşlukları ayrıştırmakla uğraştım, ancak dönüşümü tamsayıya çevirmede sorun yaşıyorum.

cevap

6

Bu yardımcı olur mu? Clojure 1.3.0 yılında:

(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) 

Eğer clojure.string ad yoktur kullandığınız Clojure sürümü use komutu atlayabilirsiniz ve şu şekilde işlevini tanımlar.

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

Sen son satırında (.split string " ") kullanarak düzenli ifadeler kurtulabilirsiniz.

+0

O olmalı '(.split dize # " ")' tabii :) –

+2

@googolplex, '(.split dize"")' aslında. Yine de işaret ettiğin için teşekkürler, cevabı gözden geçirdim. – Jan

+0

Teşekkürler. İki adımı entegre ettiniz. Bu, karakter dönüşümü hakkında neden bir hata aldığımı ve dize dönüştürme işlemiyle ilgili bir ip attığımı açıklıyor. Emin olmak için bunu deneyeceğim. – octopusgrabbus

3

tüm numaralar için Works ve iadeler

(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))) 

Ör (eğer çıkan devamında, nils filtre böylece) bir sayı değil durumunda nil

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