2013-04-15 10 views
6

Jak przekonwertować mapę Clojure do łańcucha, prawie parę kluczy wartości, jak pokazano poniżej:Konwersja map klucze i wartości do tablicy ciągów

Clojure dane:

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

Chcę przekształcić powyższe do

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

nie chcę żadnych identyfikatorów/separatory pomiędzy ale oczywiście "starks" zawsze powinny być przestrzegane przez "winter is coming"

Próbowałem to:

(str (keys data) (vals data)) 

które wyjścia to:

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

co nie jest to, co chcę w ogóle ...

  • Do map klucze i wartości danych nie są zawsze taki sam, więc musi być generyczny
  • zawsze będzie tylko jeden poziom, jako że wartość nie będzie zawierała zagnieżdżonego map itp ..

Edit

Co ja właściwie próbuje zrobić:

Próbuję indeks kilka tysięcy Neo4j węzły z Clojure. Aby pomóc mi w tym zadaniu, używam biblioteki Neocons Clojure neo4j.

Według documentation The add-to-index akceptuje właściwości i wartości tak:

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

który jest w moim powyższym przypadku będzie wyglądać

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

teraz, mam Node , Mogę uzyskać dostęp do właściwości węzła za pomocą (:data node) i to daje mi mapę clojure.

Obiekt różni się prawie od węzła do węzła, więc próbuję dowiedzieć się, jak przekazać tę mapę do biblioteki w taki sposób, że rozumie ..

Marius Danila „s got me odpowiedź prawie na miejscu.

Doing

(map name (apply concat data)) 

nadal skarży się na trzecim parametrem, gdyż ma nawiasy wokół wyniku.

Jak mogę to osiągnąć? Czy muszę po prostu napisać wiele bloków if-not, aby samemu skonstruować właściwości?

Dzięki

Odpowiedz

2

Funkcja (nn/add-to-index ...) akceptuje tylko cztery argumenty. Węzeł, indeks i jedna para klucz/wartość. Więc masz zbyt pętli przez swoje dane, jak.

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

przeciwieństwie do funkcji w Clojure str funkcja add-to-index jest bardziej ograniczona i po prostu nie akceptuje zmienne listy parametrów.

+0

Ooh, to ma teraz sens! Dziękuję bardzo, zmodyfikuję mój kod, aby to odzwierciedlić. Dzięki jeszcze raz! – LocustHorde

+0

tak, to działa idealnie, dziękuję! Przysięgam, że mogę dodać kilka nieruchomości jednocześnie ... ale oczywiście myślę o czymś innym. Dzięki jeszcze raz! – LocustHorde

8

To powinno załatwić sprawę:

(map name (apply concat data)) 

Mapa może być postrzegana jako sekwencja par klucz-wartość, która z kolei w postaci tablic 2 elementów. Łączymy pary, a następnie wyodrębniamy nazwę ze słów kluczowych i ciągów znaków (dla napisu to nic nie robi, dla słów kluczowych zwraca bit bez ":").

z kodu pan pisał, zgaduję byłoby użyć to tak:

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

Witaj, dzięki! to prawie mnie tam dosięgło, ale mam szelki dookoła sznurka .. tak jak: '' ("starks" "nadchodzi zima" "Lannister" "Usłysz mnie ryk") '' - Próba zamiany na ciąg i zamiana to nie działa zgodnie z oczekiwaniami ... jak mam się pozbyć nawiasów klamrowych? Potrzebuję go jako ciąg, na przykład – LocustHorde

+1

@LocustHorde Ok, zaktualizowałem swoją odpowiedź. Mam nadzieję, że tego właśnie szukasz. –

+0

Witam, przepraszam, może nie komunikować się poprawnie, potrzebuję tablicy łańcuchów, z kluczami i ich odpowiednimi wartościami obok siebie. Zaktualizuję pytanie .. Dziękuję bardzo. – LocustHorde

2

Można użyć wektor mieć tablicę jak losowego dostępu:

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

Mogłabyś spróbuj następujących:

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

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

Cześć, dziękuję, daje to ten sam rezultat, co odpowiedź Mariusa Danili . Ostatnia odpowiedź na to pytanie mówi mi, że funkcja ta nie wymaga więcej niż 4 argumentów. Przysięgam, że mogłem przekazać wiele argumentów! ale dzięki! – LocustHorde

Powiązane problemy