clojure中的数字序列分区
我有以下意见:clojure中的数字序列分区,clojure,Clojure,我有以下意见: (def nums [123456789012 123456789012]) 我想要以下输出: [[1234 5678 9012] [1234 5678 9012]] *注意这两个序列都包含数字而不是字符串 我认为,通过执行以下操作,这将非常简单: 将每个条目转换为字符串 将每个字符串划分为4 将每个分区转换回整数 以下是我失败的尝试: (defn split-nums [nums factor] (map #(map (fn [x] (Intege
(def nums [123456789012 123456789012])
我想要以下输出:
[[1234 5678 9012] [1234 5678 9012]]
*注意这两个序列都包含数字而不是字符串
我认为,通过执行以下操作,这将非常简单:
(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,所以我肯定不是专家
(defn split-nums [nums factor]
(map #(map (fn [x] (Integer/valueOf (apply str x))) ; apply str
(partition factor (str %)))
nums))
(str(lazy seq[1]);“clojure.lang。LazySeq@20“
(应用str(lazy seq[1]);“1”
我可能会写它来接受一个数字,然后使用
map
,而不是使用coll
(defn split-number [n factor]
(->> (str n)
(partition-all factor) ;; or partition
(map (partial apply str))
(map #(Integer/valueOf %))))
(地图#(分割编号%4)[12345678 12345678])
;;=>((12345678)(12345678))
如果您希望使用整数而不是字符串:
(mod 5151 10)
;=>1
获取最低有效位
(def nums [123456789012 123456789012])
(defn part-int [l n]
(map #(Integer. (apply str %))
(partition l (str n))))
(map (partial part-int 4) nums)
;; => ((1234 5678 9012) (1234 5678 9012))
(/515110)
;=>515
删除最低有效位。在这种情况下,我认为for非常适合使用。你没有那么多地图
(def nums [123456789012 123456789012])
(defn part-int [l n]
(map #(Integer. (apply str %))
(partition l (str n))))
(map (partial part-int 4) nums)
;; => ((1234 5678 9012) (1234 5678 9012))
(def nums [123456789012 123456789012])
(for [num nums]
(map #(Integer. (apply str %))
(partition 4 (str num))))
;; => ((1234 5678 9012) (1234 5678 9012))
通过@nickik,上述溶液略有变化
(partition 3
(map #(Integer. (apply str %))
(partition 4
(apply concat (map str nums)))))
为什么先转换成字符串?这是一个带有
/
和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)))
最好是提取函数。此外,我确信当我转换回整数时,我需要处理可能的前导零,但我认为这不会太难解决:-)哇!stackoverflow clojure社区非常棒。很多好的答案,我现在看到了我愚蠢的错误和一些更好的想法。我将在试用后不久进行升级投票。(应用concat(map…)=(mapcat…)您的解决方案实际上更加灵活,因为您正在进行两个分区,因此您可以轻松地使代码生成[[1234 5678][9012 1234][5678 9012]]这不是我的要求之一,但仍然很有趣。你有一个额外的结束语-很容易做到。否则就可以了。谢谢你指出了我的错误所在——将序列串在一起,而不是将序列中的每个元素串在一起生成一个新的字符串。此外,我同意你的想法,让方法接受一个单一的数字。我仍然习惯于其他语言,这些语言处理集合的功能不那么强大/简洁。最后,是的,直接处理数字可能比进行转换更好。读取字符串比使用整数慢十倍多。或Integer/parseInt或Integer/valueOf等可以工作,但确实存在前导零问题。如果输入为[123406789012 123406789012],则会失败。不过,感谢您提供的替代解决方案。