在clojure中对数字序列进行分区

Tra*_*ger 3 clojure

我有以下输入:

(def nums [123456789012 123456789012])
Run Code Online (Sandbox Code Playgroud)

我想要以下输出:

[[1234 5678 9012] [1234 5678 9012]]
Run Code Online (Sandbox Code Playgroud)

*注意这两个序列都包含数字而不是字符串......

我认为通过执行以下操作会非常简单:

  1. 将每个条目转换为String
  2. 将每个字符串分区为4
  3. 将每个分区转换回整数

这是我失败的尝试:

(defn split-nums [nums factor]
  (map
    #(map
       (fn [x] (Integer/valueOf (str x)))
       (partition factor (str %)))
  nums))

(println (split-nums nums, 4))
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我收到以下错误:

Caused by: java.lang.NumberFormatException: For input string: "clojure.lang.LazySeq@4834333c"
Run Code Online (Sandbox Code Playgroud)

这告诉我,我正在处理一个懒惰的序列,我需要强制评估,但当我尝试(str(doall x))我得到相同的结果.

所以我在哪里出错?这是一个好方法吗?BTW.我刚刚开始学习clojure,所以我当然不是专家.

Kin*_*aro 7

为什么首先转换为String?这是一个带/和的版本mod.这也将修复您的前导零问题.

(defn int-partition [num size]
   (let [f (int (Math/pow 10 size))]
      (loop [n num l ()]
         (if (zero? n) 
            (vec l) 
            (recur (int (/ n f)) (conj l (mod n f)))))))

(defn split-nums [nums factor] (vec (map #(int-partition % factor) nums)))
Run Code Online (Sandbox Code Playgroud)