2013-05-16 5 views
7

Ich habe eine Zeichenfolge in Clojure und ein Zeichen, das ich zwischen dem n-ten und (n + 1) st-Zeichen setzen möchte. Zum Beispiel: Nehmen wir an, die Zeichenfolge ist "aple" und ich möchte ein weiteres "p" zwischen "p" und "l" einfügen.Clojure: Idiomatische Möglichkeit, ein Zeichen in eine Zeichenfolge einzufügen

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

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

Ich finde das etwas schwierig, so dass ich denke, ich Informationen über einige nützliche Funktion bin fehlt (e) Kann mir bitte jemand helfen, die „etwas-Funktion“, schreiben darüber einen String, eine andere Zeichenfolge, eine Startposition und eine Endposition und fügt den zweiten String in den ersten zwischen der Startposition und der Endposition ein? Danke im Voraus!

Antwort

11

Effizienter als Seq Funktionen:

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

Vom REPL:

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

NB. Diese Funktion interessiert sich nicht für den Typ c, oder seine Länge im Falle einer Zeichenfolge; (str-insert "aple" \p 1) und (str-insert "ale" "pp" 1) funktionieren auch (im Allgemeinen (str c) wird verwendet, das ist die leere Zeichenfolge, wenn c ist nil und (.toString c) anderenfalls).

Da die Frage nach einem idiomatischen Weg zur Ausführung der Aufgabe verlangt, werde ich auch bemerken, dass ich es vorziehe (im Sinne von "semantischer Anpassung" zusätzlich zum Leistungsvorteil), stringorientierte Funktionen zu verwenden speziell mit Strings umgehen; Dazu gehören subs und Funktionen von clojure.string. Eine Diskussion über das idiomatische String-Handling finden Sie unter the design notes at the top of the source of clojure.string.

+2

Übrigens ist der Unterschied in der Geschwindigkeit ziemlich ausgeprägt. Ein Criterium Quick Benchmark sagt mir '(str-insert" Ap "" p "1)' dauert etwa 180 ns, was 12,5x weniger als die Seq-basierte Version ist 2,25 μs. –

+1

Hinweis 'subs' umschließt die' substring' von Java und 'str' verwendet' StringBuilder'. Ich denke nicht, dass es besser geht. –

Verwandte Themen