2013-07-16 8 views
5

Ich bin neu in Clojure. Ich definiere einen Vektor mit String-Werten. Die Anforderung besteht darin, die durch Komma getrennten String-Werte vom Eingabevektor abzurufen. Zum Beispiel:Komma getrennte String-Werte von einem Vektor

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

Meine sollte erwartete Ausgabe sein:

"one", "two", "three" 

versuchte ich interpose und join wie unten dargestellt:

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

Beide Rückkehr "one,two,three" aber ich brauche jede Saite durch Doppel umgeben zitiert "" wie in meinem Beispiel oben.

Antwort

2

Verwenden map jede Zeichenfolge mit Anführungszeichen zu umgeben, und merken, wie wir einen Apostroph mit \", ein Zeichenliteral darstellen:

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

gewarnt, aber: ein String ist der Text enthielt in den "" Zeichen , aber die Anführungszeichen selbst sind nicht Teil der Zeichenfolge. also die "one,two,three" Ausgabe ist nicht per se falsch, es sei denn, Sie wirklich brauchen wirklich diese zusätzlichen Anführungszeichen rund um den Text.

+0

Zeichenliterale auch zulässig, wenn Sie ein paar Tastenanschläge speichern: '... (Karte # (str \ "% \") my-strings) ... ' –

+0

@ A.Webb das sieht schöner aus, ich habe meine Antwort bearbeitet. Danke :) –

+1

Quote Wrapping ist auch das Verhalten des Objekts Drucker für Zeichenfolgen: '(clojure.string/join", "(Karte pr-str my-Strings))'. –

0

Ihre erwartete Ausgabe kann in keiner Weise sein "eins", "zwei", "drei". Was für ein Typ wäre es dann? Dynamische Typen sind keine Nicht-Typen. Aber natürlich können Sie es als String haben. Und diese Zeichenfolge muss irgendwie in repl. Dargestellt werden.

Bitte beachten Sie auch, dass Komma, in Clojure Leerzeichen ist.

Sonderzeichen, wie ", sollen maskiert werden. In diesem Fall: \".

Die Anführungszeichen, die Sie in repl sehen, sind keine Teile der Zeichenkette (außer escape). Die Zeichenfolge ist eine, nicht "one". Wenn Sie "eins" wollen, sehen Sie "\" eins \ "".

Die Antwort von Óscar ist nicht präzise. Der Code gibt nicht aus, was dort angezeigt wird. Es gibt "eins", "zwei", "drei" aus. (Sie können nach Bedarf ein zusätzliches Leerzeichen hinzufügen, um genau Ihren Anforderungen zu entsprechen.).

Dennoch ist seine Antwort richtig: Es gibt Ihnen genau das, was Sie wollen. Es ist eine Kette von einem Wort aus ein von doppelten Anführungszeichen umgeben und gefolgt von einem Komma usw.

Versuchen Sie, spucken es in eine Datei. Ich tat (zusätzlichen Platz nach Komma hinzufügen). Die Datei hatte:

"one", "two", "three" 

Beifall -

P. S. LightTable ist super!

0

Die folgende tut auch den Trick:

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

Ausgang:

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