2013-05-16 7 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. 

내가이 다소 어려운 찾는거야, 그래서 내가 몇 가지 유용한 기능 (들) 누군가가 그 문자열을 사용합니다 위에 나를 "어떤 기능"을 작성하는 데 도움 주실 래요에 대한 정보를 잃었 파악, 다른 문자열, 시작 위치와 끝 위치 사이의 첫 번째 문자열에 두 번째 문자열을 삽입합니다. 미리 감사드립니다!

답변

11

서열 함수를 사용하는 것보다 더 효율적인

(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) 인 경우 빈 문자열).

문제는 당면한 작업을 수행하는 관용적 인 방법을 요구하므로, 문자열 지향 함수를 사용할 때 (성능 이점 이외에도 "의미 적 적합성"측면에서) 선호하는 것으로 나타났습니다. 특히 문자열 다루기; 여기에는 subsclojure.string의 기능이 포함됩니다. 관용적 인 문자열 처리에 대한 설명은 the design notes at the top of the source of clojure.string을 참조하십시오.

+2

그런데 속도의 차이는 꽤 뚜렷합니다. Criterium 빠른 벤치 마크는'(str-insert "aple" "p"1)'이 약 180 ns 걸리며 seq 기반 버전의 2.25 μs보다 12.5 배 작습니다. –

+1

'subs'는 자바의'substring'을 감싸고'str'은'StringBuilder'를 사용합니다. 나는 더 잘할 수 있다고 생각하지 않는다. –