2013-05-16 92 views
7

插入字符我有Clojure中的一個字符串,我希望把在第n和(n + 1)個字符之間的字符。例如:可以說字符串是「aple」,我想在「p」和「l」之間插入另一個「p」。Clojure的:習慣的方法在一個字符串

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

    ;; prints "apple" 
    ;; ie "aple" -> "ap" "p" "le" and the concatenated back together. 

我發現這個頗具挑戰性,所以我想我缺少的一些有用的功能(S)是否有人可以幫我寫的「某些功能」上面說需要一個字符串信息,另一個字符串,一個開始位置和一個結束位置,並將第二個字符串插入到第一個開始位置和結束位置之間?提前致謝!

回答

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))) 

從REPL:

user=> (str-insert "aple" "p" 1) 
"apple" 

NB。這個功能實際上並不關心c,或它在一個字符串的情況下長度的類型; (str-insert "aple" \p 1)(str-insert "ale" "pp" 1)也工作(一般來說,將使用(str c),這是空字符串,如果cnil(.toString c),否則)。

由於問題需要一種慣用的方式來執行手頭的任務,我還會注意到,在使用面向字符串的函數時,我發現它更適合於使用面向字符串的函數(在「語義適合」方面除了性能優勢外)專門處理字符串;這包括從clojure.stringsubs和功能。有關慣用字符串處理的討論,請參閱the design notes at the top of the source of clojure.string

+2

順便說一句,在速度上的差異相當明顯。一個繞圈快基準告訴我'(STR-插入「APLE」「P」 1)'大約需要180納秒,這是12.5倍小於基於SEQ版本的2.25微秒。 –

+1

注意'subs'包裝Java的'substring'和'str'使用'StringBuilder'。我認爲不可能做得更好。 –

相關問題