2013-05-16 14 views
7

Ho una stringa in Clojure e un carattere che desidero inserire tra il carattere ennesimo e (n + 1). Ad esempio: diciamo che la stringa è "aple" e voglio inserire un'altra "p" tra "p" e "l".Clojure: modo idiomatico di inserire un carattere in una stringa

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

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

mi sto trovando questo un po 'impegnativo, quindi immagino che mi manca un po' di informazioni sulla funzione utile (s) Qualcuno può aiutarmi a scrivere il "alcuni funzione" di cui sopra che prende una stringa, un'altra stringa, una posizione iniziale e una posizione finale e inserisce la seconda stringa nella prima tra la posizione iniziale e la posizione finale? Grazie in anticipo!

risposta

11

più efficiente rispetto all'utilizzo di funzioni ss:

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

Dal REPL:

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

NB. Questa funzione in realtà non interessa il tipo di c o la sua lunghezza nel caso di una stringa; (str-insert "aple" \p 1) e (str-insert "ale" "pp" 1) funzionano anche (in generale, verrà utilizzato (str c), che è la stringa vuota se c è nil e (.toString c) in caso contrario).

Poiché la domanda richiede un modo idiomatico per eseguire l'operazione a portata di mano, noterò anche che trovo preferibile (in termini di "adattamento semantico" oltre al vantaggio prestazionale) utilizzare funzioni orientate alla stringa quando occuparsi specificamente di stringhe; questo include subs e funzioni da clojure.string. Vedi the design notes at the top of the source of clojure.string per una discussione sulla gestione delle stringhe idiomatiche.

+2

A proposito, la differenza di velocità è abbastanza pronunciata. Un rapido benchmark di Criterium mi dice '(str-insert" aple "" p "1)' richiede circa 180 ns, che è 12,5x in meno rispetto ai 2,25 μs della versione seq. –

+1

Nota 'subs' avvolge la' substring' di Java e 'str' usa' StringBuilder'. Non penso sia possibile fare di meglio. –

Problemi correlati