2011-06-21 7 views
5

は、次のことを考えてみましょう:なぜ、空のファイルから文字列を分割すると1要素が返されますか?

=> (even? (count [])) 
true 

これまでのところは良いです。今、(私のファイルが空であると仮定)を検討:

(odd? (count (str/split (slurp my-file) #"\|"))) 
true 

ERR ...ベクトルが空のファイルもない(ゼロ)から返される理由は?

=>(str/split (slurp my-file) #"\|") 
[""] 

この場合、空の文字列が返される理由を説明できますか?

ファイルに奇数個のレコードがあるかどうかを確認しようとしています。

答えて

7

clojure.string/splitは、分割を行うためにjava.util.regex.Pattern/splitを使用します。説明については、this question about Javaを参照してください。つまり、splitは、パターンがまったく一致しない場合でも、パターンの最初の一致前のすべてを最初の分割として返します。

コレクション(リスト、配列、マップ、文字列など)が空であるかどうかをテストする正規の方法は、seqを呼び出すことです。空のコレクションにはnilが返されます。

(defn odd-number-of-records? [filename] 
    (let [txt (slurp filename)] 
    (when (seq txt) 
     (odd? (count (str/split txt #"\|")))))) 
+1

この場合、単純に入力文字列の数をチェックすることもできます。 '(let [...])(when(pos?(count txt))...))'私はこれを少しきれいにします。なぜなら、即座に投げ捨てられるseqオブジェクトを不必要に割り当てるわけではないからです。データ構造上の 'seq'は' count'に比べて高価です。 – kotarak

関連する問題