【问题标题】:Create a list from a string in Clojure在 Clojure 中从字符串创建列表
【发布时间】:2011-01-29 12:09:23
【问题描述】:

我正在寻找使用字符串作为源来创建字符列表。我做了一些谷歌搜索但什么也没想到,所以我写了一个函数来做我想要的:

(defn list-from-string [char-string]
  (loop [source char-string result ()]
    (def result-char (string/take 1 source))
    (cond
     (empty? source) result
     :else (recur (string/drop 1 source) (conj result result-char)))))

但是看着这个让我觉得我一定是错过了一个技巧。

  1. 是否有核心或贡献函数可以为我执行此操作?我肯定只是在装傻吧?
  2. 如果没有,有没有办法改进此代码?
  3. 同样的方法也适用于数字吗?

【问题讨论】:

    标签: clojure clojure-contrib


    【解决方案1】:

    您可以使用 seq 函数来执行此操作:

    user=> (seq "aaa")
    (\a \a \a)
    

    对于数字,您可以使用“哑”解决方案,例如:

    user=> (map (fn [^Character c] (Character/digit c 10)) (str 12345))
    (1 2 3 4 5)
    

    附: clojure 中的字符串是 'seq'able,因此您可以将它们用作任何序列处理函数的源 - map、for、...

    【讨论】:

    • 嗨! [^字符 c] 是什么意思? ^Character 是在里面使用字符/数字吗?
    • 这是类型提示,没有它,clojure 将使用反射来确定参数类型。这使得函数稍微快一点...
    【解决方案2】:

    如果您知道输入将是字母,请使用

    user=> (seq "abc")
    (\a \b \c)
    

    对于数字,试试这个

    user=> (map #(Character/getNumericValue %) "123")
    (1 2 3)
    

    【讨论】:

      【解决方案3】:

      编辑:哎呀,你以为你想要一个不同字符的列表。为此,请使用核心功能“频率”。

      clojure.core/frequencies
      ([coll])
        Returns a map from distinct items in coll to the number of times they appear.
      

      例子:

      user=> (frequencies "lazybrownfox")
      {\a 1, \b 1, \f 1, \l 1, \n 1, \o 2, \r 1, \w 1, \x 1, \y 1, \z 1}
      

      那么你所要做的就是得到密钥并将它们变成一个字符串(或不)。

      user=> (apply str (keys (frequencies "lazybrownfox")))
      "abflnorwxyz"
      

      【讨论】:

      • 谢谢。我不想得到频率,但我对小费仍然很感兴趣。
      【解决方案4】:
      (apply str (set "lazybrownfox")) => "abflnorwxyz"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-20
        • 2016-02-13
        • 2020-04-21
        • 2022-11-16
        • 2016-12-02
        • 1970-01-01
        • 2014-02-10
        • 1970-01-01
        相关资源
        最近更新 更多