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

标签 clojure

我有以下输入:

(def nums [123456789012 123456789012])

我想要以下输出:

[[1234 5678 9012] [1234 5678 9012]]

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

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

  1. 将每个条目转换为字符串
  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))

当我运行此程序时,出现以下错误:

Caused by: java.lang.NumberFormatException: For input string: "clojure.lang.LazySeq@4834333c"

这告诉我,我正在处理一个惰性序列,我需要强制对其进行求值,但是当我尝试 (str (doall x)) 时,我得到了相同的结果。

那么 Clojure 专家我哪里出错了?这是一个好方法吗?顺便提一句。我刚刚开始学习 clojure,所以我当然不是专家。

最佳答案

为什么要先转换为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)))

关于clojure - 在 Clojure 中对数字序列进行分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4037570/

相关文章:

macros - 在 clojure 宏中取消引用拼接并包装在向量中

clojure - RxClojure - rx/return 和 rx/observable* 之间有什么区别?

clojure - YeSQL 有连接池吗?

multithreading - Clojure 中的多线程合并排序算法

java - Java 的 toString() 对 Clojure 函数的等价物

java - 没有 Java 的 ClojureScript

Clojure 关键字和可选参数问题

recursion - Clojure 尾递归与素数

json - 在 Clojure 中使用 Amazonica 时,应该如何格式化 Kinesis 事件的数据?

clojure - boot.properties 中需要哪些信息?