【问题标题】:How to convert a clojure string of numbers into separate integers?如何将 clojure 数字字符串转换为单独的整数?
【发布时间】:2025-12-12 02:20:06
【问题描述】:

我可以像这样在 repl 中读取一些数据。对于一个真正的程序,我计划以 let 特殊形式分配。

(def x1 (line-seq (BufferedReader. (StringReader. x1))))

如果我输入 5 5,x1 将绑定到 ("5 5")

我想将这个包含一个元素的列表转换为包含两个整数的列表。我怎样才能做到这一点?我一直在尝试解析空格上的字符串,但是在执行到整数的转换时遇到了麻烦。

【问题讨论】:

    标签: clojure


    【解决方案1】:

    这有帮助吗?在 Clojure 1.3.0 中:

    (use ['clojure.string :only '(split)])
    (defn str-to-ints
      [string]
      (map #(Integer/parseInt %)
            (split string #" ")))
    (str-to-ints "5 4")
    ; => (5 4)
    (apply str-to-ints '("5 4"))
    ; => (5 4)
    

    如果您使用的 Clojure 版本没有 clojure.string 命名空间,您可以跳过 use 命令并按以下方式定义函数。

    (defn str-to-ints
      [string]
      (map #(Integer/parseInt %)
            (.split #" " string)))
    

    您可以通过在最后一行使用(.split string " ") 来摆脱正则表达式。

    【讨论】:

    • @googolplex,(.split string " ") 实际上。感谢您指出这一点,我已经修改了答案。
    • 谢谢。您集成了两个步骤,这解释了为什么我收到一个关于字符转换的错误和另一个关于字符串到字符转换的错误。我会去试试这个以确保。
    • 如果使用 .split 就这么简单,那么引入带有 use 函数的 clojure.string 库有什么意义呢?每个人都有自己的特定用例吗?
    【解决方案2】:

    适用于所有数字并在它不是数字的情况下返回 nil(因此您可以在结果序列中过滤掉 nil)

    (require '[clojure.string :as string])
    
    (defn parse-number
      "Reads a number from a string. Returns nil if not a number."
      [s]
      (if (re-find #"^-?\d+\.?\d*$" s)
        (read-string s)))
    

    例如

    (map parse-number (string/split "1 2 3 78 90 -12 0.078" #"\s+"))
    ; => (1 2 3 78 90 -12 0.078)
    

    【讨论】:

      【解决方案3】:

      字符串可以用括号括起来,然后用读取字符串函数评估为 clojure 列表:

      (def f #(read-string (str "(" % ")")))
      (f "5 4")
      ; => (5 4)
      

      【讨论】:

      • 请考虑添加一些解释。