Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
clojure中的数字序列分区_Clojure - Fatal编程技术网

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]]
*注意这两个序列都包含数字而不是字符串

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

  • 将每个条目转换为字符串
  • 将每个字符串划分为4
  • 将每个分区转换回整数
  • 以下是我失败的尝试:

    (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],则会失败。不过,感谢您提供的替代解决方案。