Clojure递归函数

时间:2011-10-16 22:19:33

标签: recursion clojure split concatenation

作为一名Clojure新手,我对这个小问题感到困扰:

我想迭代序列并执行split,然后在序列元素上执行str(串联)函数。

这是我的序列:

(("2.660.784") ("2.944.552") ("44.858.797"))

我想得的是这样的:

("2660784" "2944552" "44858797")

这是我尝试为我的问题创建递归解决方案:

(defn old 
      [squence]
      (let [size (count squence)]
        (loop [counter 1]
          (if (<= counter size)
            (apply str (clojure.string/split 
                   (first (first squence))
                   #"\b\.\b"
                   ))
            (old (rest squence)))
          )))

当然,这不是解决方案,因为它仅将splitstr应用于一个元素,但我想对squence中的每个元素重复此操作。 squence是我项目中其他一些功能的产物。

我肯定错过了一些东西所以请帮我解决这个问题...

4 个答案:

答案 0 :(得分:6)

编写它的最简单方法是使用replace,而不是split / str。一旦你编写了一个可以对单个字符串进行转换的函数,就可以使用mapfor对一系列字符串进行转换。在这里我不得不进行一些构造,因为无论出于何种原因,序列中的每个元素本身都是另一个序列;我刚拿出第一个元素。

(for [[s] '(("2.660.784") ("2.944.552") ("44.858.797"))]
  (clojure.string/replace s #"\b\.\b" ""))

答案 1 :(得分:3)

user=> (defn reject-char-from-string
  [ch sequence]
  (map #(apply str (replace {ch nil} (first %))) sequence))
#'user/reject-char-from-string
user=> (reject-char-from-string \. '(("2.660.784") ("2.944.552") ("44.858.797"))
)
("2660784" "2944552" "44858797")

答案 2 :(得分:1)

试过这个?

=> (flatten '(("2.660.784") ("2.944.552") ("44.858.797")))
("2.660.784" "2.944.552" "44.858.797")

答案 3 :(得分:1)

这么简单吗?

(def data '(("2.660.784") ("2.944.552") ("44.858.797")))
(require '[clojure.string :as string])
(map #(string/replace (first %1) "." "") data)
;=> ("2660784" "2944552" "44858797")