2013-07-16 8 views
5

Sono nuovo di Clojure. Sto definendo un vettore contenente valori di stringa. Il requisito è quello di recuperare i valori di stringa separati da una virgola dal vettore di input. Ad esempio:Virgola separati Valori stringa da un vettore

(def my-strings ["one" "two" "three"]) 

mio output previsto dovrebbe essere:

"one", "two", "three" 

Ho provato interpose e join come mostrato di seguito:

(apply str (interpose "," my-strings)) 
(clojure.string/join "," my-strings) 

Sia ritorno "one,two,three" ma ho bisogno ogni stringa circondato da doppio cita "" come nel mio esempio sopra.

risposta

2

Usa map per circondare ogni stringa con le citazioni, e notare come ci rappresentiamo una singola citazione utilizzando \", un carattere letterale:

(clojure.string/join "," (map #(str \" % \") my-strings)) 
=> "one","two","three" 

Attenzione, però: una stringa è il testo contenuto all'interno delle "" personaggi , ma le virgolette non fanno parte della stringa. quindi l'output "one,two,three" non è errato di per sé, a meno che non si abbia davvero bisogno di quelle virgolette extra che circondano il testo, a meno di.

+0

letterali di carattere se si vuole risparmiare pochi tasti: '... (mappa # (str \ "% \") my-string) ... ' –

+0

@ A. Webb che sembra più bello, ho modificato la mia risposta. Grazie :) –

+1

Il wrapping delle quotazioni è anche il comportamento della stampante oggetto per le stringhe: '(clojure.string/join", "(map pr-str my-strings))'. –

0

L'output previsto in alcun modo può essere "uno", "due", "tre". Che tipo sarebbe, allora? I tipi dinamici non sono no-tipi. Ma, naturalmente, puoi averlo come stringa. E questa stringa deve essere rappresentata in qualche modo in repl.

Inoltre si ricorda che la virgola, in Clojure è spazio bianco.

Caratteri speciali, come ", devono essere preceduti da escape. In questo caso: \".

Le virgolette che vedete in repl non sono parti della stringa (a meno che non siano fuggite). La stringa è uno, non "uno". Se si desidera "" uno ", viene visualizzato " \ "uno" ".

La risposta di Óscar non è precisa. Il codice non emette ciò che è mostrato lì. Emette "\" uno \ ", \" due \ ", \" tre \ "". (Puoi aggiungere uno spazio in più dopo, per soddisfare esattamente le tue esigenze.).

Tuttavia, la sua risposta è corretta: ti dà esattamente quello che vuoi. Si tratta di una stringa costituito da una parola uno circondato da virgolette doppie e seguito da una virgola, ecc

Provare a sputare in un file. Ho fatto (aggiungendo spazio extra dopo la virgola). Il file ha avuto:

"one", "two", "three" 

Cheers -

P.S. LightTable è eccezionale !!!

0

Di seguito fa anche il trucco:

(let [strs ["one" "two" "three"]] 
    (println 
    ;;    outer quote  strings outer quote 
    (apply str (flatten [\" (interpose "\",\"" strs) \"])))) 

in uscita: sono ammessi anche i

user=> (let [strs ["one" "two" "three"]] (println (apply str (flatten [\" (interpose "\",\"" strs) \"])))) 
"one","two","three" 
nil 
user=>