Clojure:在字符串中插入字符的惯用法

Dav*_*ams 7 string concatenation clojure

我在Clojure中有一个字符串,我想在第n个和第(n + 1)个字符之间插入一个字符.例如:假设字符串是"aple",我想在"p"和"l"之间插入另一个"p".

  (prn 
     (some-function "aple" "p" 1 2)) 

  ;; prints "apple" 
  ;; ie "aple" -> "ap" "p" "le" and the concatenated back together.
Run Code Online (Sandbox Code Playgroud)

我发现这有点挑战,所以我想我错过了一些有用的功能的信息有人可以帮我写上面的"some-function",它带有一个字符串,另一个字符串,一个起始位置和一个结束位置并将第二个字符串插入起始位置和结束位置之间的第一个字符串?提前致谢!

Mic*_*zyk 11

比使用seq函数更有效:

(defn str-insert
  "Insert c in string s at index i."
  [s c i]
  (str (subs s 0 i) c (subs s i)))
Run Code Online (Sandbox Code Playgroud)

来自REPL:

user=> (str-insert "aple" "p" 1)
"apple"
Run Code Online (Sandbox Code Playgroud)

NB.c在字符串的情况下,此函数实际上并不关心其类型或长度; (str-insert "aple" \p 1)(str-insert "ale" "pp" 1)工作还(在一般情况下,(str c)将被使用,这是空字符串,如果cnil(.toString c)其他).

由于这个问题要求用惯用的方法来执行手头的任务,我还要注意,我发现在处理特定字符串时使用面向字符串的函数更可取(除了性能优势方面的"语义匹配") ; 这包括subs和功能clojure.string.有关惯用字符串处理的讨论,请参阅源代码顶部的设计说明clojure.string.

  • 顺便说一下,速度的差异非常明显.一个Criterium快速基准测试告诉我`(str-insert"aple""p"1)`需要大约180 ns,比基于seq的版本的2.25μs小12.5倍. (2认同)
  • 注意`subs`包装Java的`substring`,`str`包含`StringBuilder`.我认为不可能做得更好. (2认同)