2017-04-15 3 views
0

私はMathematicaのグラフにClojureのマップを変換しようとしています、マップ関係は、関数がClojureの文字列のインデックス:-1

(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)) "}")) 
    ) 
) 

として定義されて

{: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 []} 

です

"{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}" 

のような文字列を与えるはずですが、コンパイラ例外として実行されますjava.lang.StringIndexOutOfBoundsException:範囲外の文字列インデックス:-1、コンパイル:(フォームinit2059367294355507639.clj:269:20)問題は、私は行線によって(&のexprを行う)のコードをテストしている

彼らは期待どおりに働いていましたが、私がこの機能に入れたときにエラーが発生しました。

+0

元の質問に戻るには、for-expressionで何もしないでください。したがって、その結果は何も変化しません。 '' temp = '{''と ''(count temp) ''を使って、 '' temp''を参照しています。 '。したがって、部分文字列の最初のインデックスである '( - 1 2)' => '-1'を計算しています。これは明らかにあなたが望むものではありません。 – n2o

答えて

3

def-in-defを使用しているので、Clojureの基本が欠けているようです。これはあなたが最初に始めるべき場所です。

問題を小さな問題に分割するのは良い方法です。問題を小さな問題に分割するのは良い方法です。したがって、最初のステップは、組み合わせを作成し、次にそれらを目的の文字列の組み合わせに変換し、最後のステップで完全な文字列を作成することです。

(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) "}"))) 

(コメントから応用の提案、@Thumbnailのおかげで)

本当に言語を使い始めるためにClojureの基礎で遊んでください:これは、このようになります。良い出発点は確かですbraveclojure.com

+2

あなたはすでに破壊と 'for'を使用しているので、' combined 'を表す明確な方法は '([k vs] data、v vs] [k v])'です。 – Thumbnail

関連する問題