在字符串中添加字符以得到另一个字符串?

25
我想给一个字符串添加一个字符,得到另一个包含该字符的字符串作为结果。
这段代码不起作用:
(cons \a "abc")

可能的解决方法,按优先级排序:

  1. Clojure核心函数
  2. Clojure库函数
  3. Clojure用户自定义(我自己!)函数(例如(apply str (cons \a "abc"))
  4. java.lang.String方法

在我自己动手之前,是否有第一类别的解决方案?


编辑:这是一个相当愚蠢的问题。:(


有时候Clojure函数的名字不是特别清晰。另外,虽然有一个concat函数,但它只适用于集合,而字符串不是集合。思考一下...为什么它们不应该是集合呢?它们毕竟是不可变的Java字符串。 - Dan Filimon
1
实际上,concat 是用于字符串的,只是它不返回一个字符串,而是一个字符序列。如果我没记错的话,你可以在任何需要集合的地方使用字符串,但是字符序列不会自动转换回字符串。 - Christian Berg
如果你想将字符序列转换回字符串 --> (apply str char-seq) - Simon Polak
2个回答

58
如下所示:

这样怎么样:

(str "abc" \a)

在我的机器上,这会返回 "abca"。

你还可以将其用于任意数量的字符串/字符:(str "kl" \m "abc" \a \b)


2
你可以使用 clojure.string 中的 join 函数: (clojure.string/join [\a "abc"]) 但对于简单的用例,你应该真正只使用 str,就像 @Dan Filimon 建议的那样。 join 的额外好处是你可以在连接的字符串之间放置分隔符,但如果没有分隔符,则实际上只应用 str
(defn ^String join
  "Returns a string of all elements in coll, separated by
   an optional separator.  Like Perl's join."
  {:added "1.2"}
  ([coll]
     (apply str coll))
  ([separator [x & more]]
     (loop [sb (StringBuilder. (str x))
            more more
            sep (str separator)]
       (if more
         (recur (-> sb (.append sep) (.append (str (first more))))
                (next more)
                sep)
         (str sb)))))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接