2017-04-15 1 views
0

Ich versuche, eine clojure Karte zu einer Mathematica Grafik, die Karte Beziehungen zu konvertieren istClojure String-Index außerhalb des Bereichs: -1

{:60 [:34], :14 [:13], :39 [], :37 [:21], :59 [], :27 [:26 :32], :42 [], :45 [], :31 [:28], :40 [], :18 [:19], :52 [], :12 [:11], :11 [:9 :12 :17 :16], :24 [:25], :10 [:9], :21 [:16 :37 :36], :56 [], :23 [:25], :13 [:14], :0 [:1], :58 [], :30 [:29], :38 [], :53 [], :4 [:2 :5 :54], :43 [], :57 [], :26 [:28], :16 [:11 :5 :21 :34], :44 [], :7 [:8 :9], :35 [], :55 [], :1 [:0], :50 [], :8 [:7], :36 [:21], :22 [], :47 [], :25 [:24], :9 [:7 :10 :11], :20 [:19], :17 [:11], :46 [], :32 [:33 :35 :34], :49 [], :28 [], :48 [], :19 [:18 :20], :2 [:3 :4], :5 [:4 :6 :16 :15], :41 [], :15 [:5], :3 [], :6 [:5], :33 [], :51 [], :54 [], :29 [:30], :34 []} 

Eine Funktion ist definiert als

(defn relations-export [] 
    (do 
    (def temp "{") 
    (for [x relations] 
     (map (fn [l] (def temp (str temp (clojure.string/replace (str (first x) " -> " l ", ") ":" "")))) (second x))) 
    (def temp (str (subs temp 0 (- (count temp) 2)) "}")) 
    ) 
) 

es soll eine Zeichenfolge wie

"{60 -> 34, 14 -> 13, 37 -> 21, 27 -> 26, 27 -> 32, 31 -> 28, 18 -> 19, 12 -> 11, 11 -> 9, 11 -> 12, 11 -> 17, 11 -> 16, 24 -> 25, 10 -> 9, 21 -> 16, 21 -> 37, 21 -> 36, 23 -> 25, 13 -> 14, 0 -> 1, 30 -> 29, 4 -> 2, 4 -> 5, 4 -> 54, 26 -> 28, 16 -> 11, 16 -> 5, 16 -> 21, 16 -> 34, 7 -> 8, 7 -> 9, 1 -> 0, 8 -> 7, 36 -> 21, 25 -> 24, 9 -> 7, 9 -> 10, 9 -> 11, 20 -> 19, 17 -> 11, 32 -> 33, 32 -> 35, 32 -> 34, 19 -> 18, 19 -> 20, 2 -> 3, 2 -> 4, 5 -> 4, 5 -> 6, 5 -> 16, 5 -> 15, 15 -> 5, 6 -> 5, 29 -> 30}" 

geben, aber es läuft als CompilerException java.lang.StringIndexOutOfBoundsException: String-Index außerhalb des Bereichs: -1, Kompilieren: (Form-init2059367294355507639.clj: 269: 20)

das Problem ist, ich den Code in getestet (do & ausdr) Zeile für Zeile und sie haben wie erwartet funktioniert, aber als ich sie in diese Funktion gestellt habe, habe ich einen Fehler bekommen.

+0

Um zu Ihrer ursprünglichen Frage zurückzukehren: Sie tun nichts mit Ihrem Ausdruck. Daher ändert das Ergebnis nichts. In '(str (subs temp 0 (- (count temp) 2))"} ")' du beziehst dich auf 'temp', wobei' temp = "{" 'und' (count temp) 'dir' 1 gibt '. Sie berechnen also '(- 1 2)' => -1, was Ihr erster Index Ihrer Teilkette ist, was offensichtlich nicht das ist, was Sie wollten. – n2o

Antwort

3

Es scheint, dass Sie einige Grundlagen von Clojure fehlen, da Sie def-in-def verwenden. Hier sollten Sie beginnen.

Es könnte eine gute Idee sein, Ihr Problem in kleinere Probleme aufzuteilen, anstatt es direkt zusammen zu setzen. Daher wäre ein erster Schritt, die Kombinationen zu erstellen, sie dann in die gewünschten String-Kombinationen zu konvertieren und im letzten Schritt den kompletten String zu erstellen. Dies könnte wie folgt aussehen:

(require '[clojure.string]) 

(defn relations-export [data] 
    (let [combinations (for [[k vs] data, v vs] [k v]) 
     comb-strings (map (fn [[k v]] (str (name k) " -> " (name v))) combinations)] 
    (str "{" (clojure.string/join ", " comb-strings) "}"))) 

Bitte spielen, um mit den Clojure Grundlagen (Angewandte Vorschläge aus den Kommentaren, dank @Thumbnail) wirklich mit der Sprache, um loszulegen. Ein guter Ausgangspunkt ist sicherlich braveclojure.com

+2

Da Sie bereits Destrukturierung und 'for' verwenden, ist eine klarere Art,' Kombinationen 'auszudrücken,' (für [[k vs] Daten, v vs] [k v]) '. – Thumbnail

Verwandte Themen