2017-08-15 3 views
2

慣用のClojureで次の変換を表現するにはどうすればよいですか?Clojureのエッジを表すタプルのシーケンスへのネストされたマップ

結果にベクトルが表示される順序は気にしないので、深度優先または息吹き検索のどちらの方法も問題ありません。

+1

FWIW入力フォーマットであることはないので、グラフを表すのではない、本当に非常に良い方法サイクルがどのように機能するかを明確にする。より典型的なものは、キーがノードであり、値がノードのセットである隣接関係マップのようなものです。あなたのグラフでは、 '' {a#{b e}、b#{c d}} 'のようになります。理想的には、入力フォーマットを修正してこのステップを実行する必要はないと言いますが、それを制御できない場合は、この質問に対する回答は後処理するのが妥当な方法です。 – amalloy

答えて

8

あなたはかなり簡潔fortree-seqを使用してこれを表現することができます

(defn map->edges [m] 
    (for [entry m 
     [x m] (tree-seq some? val entry) 
     y (or (keys m) [m])] 
    [x y])) 

例:

(map->edges m) 
;;=> ([:a :b] [:a :e] [:b :c] [:b :d] [:c nil] [:d nil] [:e nil]) 
関連する問題