2013-04-15 16 views
6

Come faccio a convertire una mappa clojure nella stringa, quasi coppia chiave-valore, come illustrato di seguito:chiavi Converti mappa e valori per array di stringhe

Clojure dati:

(def data { :starks "Winter is coming" :Lannisters "Hear me roar" }) 

voglio convertire il sopra a

"starks" "winter is coming" "Lannisters" "hear me roar" 

non voglio nessun identificatori/delimitatori tra ma ovviamente "starks" devono essere sempre seguiti da "winter is coming"

ho provato questo:

(str (keys data) (vals data)) 

Quali Risulterà:

"(:starks :Lannisters)(\"Winter is coming\" \"Hear me roar\")" 

che non è quello che voglio a tutti ...

  • Le chiavi di dati cartografici e valori non sono sempre uguale quindi deve essere generico
  • ci sarà sempre un solo livello, come in, il valore non conterrà un nidificato mappa ecc ..

Modifica

Quello che sto effettivamente cercando di fare:

Sto cercando di indice di qualche migliaio di Neo4j nodi con clojure. Per aiutarmi con questo compito, sto usando la libreria Neocons Clojure neo4j.

Secondo il documentation, il add-to-index accetta proprietà e valori in questo modo:

(nn/add-to-index (:id node) (:name idx) "username" "joe"))) 

che è, nel mio caso di cui sopra, andare a guardare come

(nn/add-to-index (:id node) (:name idx) "starks" "winter is coming" "Lannisters" "Hear me roar"))) 

ora, ho il mio Nodo , Posso accedere alle proprietà del nodo con (:data node) e questo mi fornisce una mappa del clojure.

La proprietà differisce praticamente da nodo a nodo quindi sto cercando di capire come passare quella mappa alla biblioteca nel modo in cui si capisce ..

s' Marius Danila risposta mi ha fatto quasi.

Facendo

(map name (apply concat data)) 

lamenta ancora del terzo parametro, in quanto ha le parentesi intorno al risultato.

Quindi, come posso ottenere questo? Devo solo scrivere un sacco di blocchi if-not per costruire le proprietà da solo?

Grazie

risposta

2

La funzione (nn/add-to-index ...) accetta solo quattro argomenti. Il nodo, l'indice e una coppia chiave/valore. Quindi hai troppo loop dei tuoi dati come.

(doseq [[k v] data] 
    (nn/add-to-index (:id node) (:name idx) (name k) (clojure.string/lower-case v)))) 

A differenza della funzione del str in Clojure funzione add-to-index è più limitata e semplicemente non accetta liste di parametri variabili.

+0

Ooh, questo ora ha molto senso! Grazie mille, modificherò il mio codice per riflettere questo. Grazie ancora! – LocustHorde

+0

sì, funziona perfettamente, grazie! Giuro che potrei aggiungere diverse proprietà allo stesso tempo .. ma ovviamente sto pensando ad altro. Grazie ancora! – LocustHorde

8

Questo dovrebbe fare il trucco:

(map name (apply concat data)) 

Una mappa possono essere visti come una sequenza di coppie di valori-chiave, che a loro volta rappresentati come matrici di 2 elementi. Stiamo concatenando le coppie e quindi estraiamo il nome dalle parole chiave e dalle stringhe (per la stringa non fa nulla, per le parole chiave restituisce il bit senza ':').

Dal codice che hai postato, sto cercando di indovinare si può usare questo modo:

(apply nn/add-to-index (list* (:id node) (:name idx) (map name (apply concat data)))) 
+0

Ciao, grazie! questo mi sta quasi arrivando, ma ho una parentesi attorno alla corda .. come in questo modo: '' ("starks" "Winter is coming" "Lannisters" "Hear me ruggire") '' - Cercando di convertire in stringa e in sostituzione non funziona come previsto .. come faccio a sbarazzarmi delle bretelle per favore? Ho solo bisogno di una stringa, ad esempio – LocustHorde

+1

@LocustHorde Ok, ho aggiornato la mia risposta. Spero che sia quello che stai cercando. –

+0

Ciao, scusate, forse non sto comunicando correttamente, ho bisogno dell'array di stringhe, con le chiavi e i rispettivi valori uno accanto all'altro. Aggiungerò la domanda .. Grazie mille. – LocustHorde

2

È possibile utilizzare vettore di avere serie come ad accesso casuale:

=> (def v (vec (map name (apply concat data)))) 
=> (v 0) 
;"starks" 
=> (v 1) 
;"Winter is coming" 
3

Si potrebbe provare quanto segue:

=> (interleave (map name (keys data)) (vals data)) 

;; which returns ("starks" "Winter is coming" "Lannisters" "Hear me roar") 
+0

Ciao, grazie, questo dà lo stesso risultato della risposta di Marius Danila . L'ultima risposta a questa domanda mi dice che la funzione in realtà non richiede più di 4 argomenti. Giuro, pensavo di poter passare qualsiasi numero di argomenti ad esso! ma grazie! – LocustHorde

Problemi correlati