在Clojure中,为什么从一个空文件中分割字符串会返回1个元素?

3 浏览
0 Comments

在Clojure中,为什么从一个空文件中分割字符串会返回1个元素?

考虑以下情况:

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

到目前为止都还好。现在考虑(假设my-file是空的):

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

嗯...为什么从一个空文件返回的向量不是偶数(零)呢?

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

啊,有人能解释一下为什么在这种情况下返回一个空字符串吗?

我试图确定文件中是否有奇数个记录。

0
0 Comments

在Clojure中,使用`clojure.string/split`函数对字符串进行拆分时,实际上是调用了`java.util.regex.Pattern/split`函数来完成拆分操作。原因是Java中的`split`函数在拆分空字符串时会返回一个非空的数组,这与我们的直觉有些不符。

要解决这个问题,可以使用`seq`函数来判断一个集合(列表、数组、映射、字符串等)是否为空。对于空集合,`seq`函数会返回`nil`。

以下是一个示例代码,用于判断一个文件中的记录数是否为奇数:

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

在这个代码中,我们首先使用`slurp`函数将文件内容读取为字符串,并将其赋值给`txt`变量。然后,我们使用`seq`函数判断`txt`是否为空。如果不为空,我们使用`str/split`函数将字符串按照竖线符号进行拆分,并计算拆分后的元素数量。最后,我们使用`odd?`函数判断元素数量是否为奇数,并返回结果。

除了使用`seq`函数判断字符串是否为空之外,我们还可以直接使用`count`函数来判断输入字符串的长度是否大于0。以下是一个使用`count`函数的示例代码:

(let [txt (slurp filename)]
  (when (pos? (count txt))
    ;; do something
    ))

这种方法相对更加简洁,因为它避免了不必要的`seq`对象的创建。在处理大量数据时,`seq`函数的性能相对较低,而`count`函数则更加高效。

0