【问题标题】:Concatenation of the strings vector in ClojureClojure 中字符串向量的连接
【发布时间】:2012-07-08 21:20:32
【问题描述】:

我想连接存储在向量中的字符串。例如,如果我在向量中有["a" "b" "c"],我想得到"abc"的结果。

【问题讨论】:

    标签: string vector clojure


    【解决方案1】:

    您可以将applystr 函数一起使用:

    (apply str ["a" "b" "c"])
    

    【讨论】:

    • (apply str ) 是您最常使用的方法(正如 NielsK 所说,只要您不需要分隔符)
    • 如果你想分隔你可以使用interpose因此(apply str (interpose "," ["a" "b" "c"])) => "a,b,c"
    • 如果您只想在最终字符串中使用分隔符,最好使用clojure.string/join,而不是apply strinterpose 结合使用。后者使用更多的分配。如果您想在将集合转换为字符串之前对其进行更多更改,interpose 是最好的选择。
    【解决方案2】:

    您可以为此使用clojure.string join 函数

    (clojure.string/join ["a" "b" "c"])
    

    【讨论】:

    • 有没有办法使用map做到这一点?
    • 这里可以使用reduce: (reduce str ["a" "b" "c"]) 但我最好使用join函数。
    • 如果不需要clojure.string/join的分隔符,应用str是更好的解决方案。
    • @NielsK 为什么在不需要分隔符的情况下str 是更好的解决方案?我来到这里是为了寻找这个问题的答案。 :-)
    • 1 - str 在核心中,因此不需要加载额外的命名空间。 2 - 在没有分隔符的join 中,coll 中的每个项目都对 (.append sb "") 进行了多余的调用,而 str 中没有这样做。
    【解决方案3】:

    这是 Clojure 的 reduce 可以使用的方法之一。请注意 Clojure 的 REPL 上的会话:

    [dsm@localhost:~]$ clj
    Clojure 1.4.0
    user=> (reduce str ["a" "b" "c"])
    "abc"
    user=> 
    

    【讨论】:

    • apply str有什么优势吗?
    • 没有优点,只有缺点,因为reduce的每次迭代都会创建另一个Stringbuilder,这在集合中每个额外项目的计算成本更高。
    • 是的,但与apply 不同的是,它适用于采用固定数量参数的函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    相关资源
    最近更新 更多