2015-04-27 22 views
1

我有以下在Clojure中创建的数组映射。如何在Clojure中将新节点添加到散列图图中?

{:node 7, :children [{:node 8, :children []} {:node 6, :children []} {:node 23, :children {}} {:node 43, :children []}]} 

我怎么去有关添加元素融入到这一点, 运行下面的代码

(def tree (assoc-in tree [:node] 12)) 

给我

{:node 12, :children [{:node 8, :children []} {:node 6, :children []} {:node 10, :children {}} {:node 13, :children []} {:node 28, :children []}]}` 

和运行

(def tree (assoc-in tree [:node :children] 12)) 

给我以下错误消息。如何添加元素融入到儿童部分的阵列地图上

Exception in thread "main" java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.Associative, 
+0

(DEF树(缔合型树[{:节点:儿童}] 12 )) –

+0

正在运行,这给了我'{{:node:children} 12,:node 7,:children [{:node 8,:children {}} {:node 6,:children {}} {:node 23,:子节点{}} {:node 43,:children {}}]}' – Conor

+0

您是否尝试更新节点12的子节点? –

回答

1

让我们的树分配到t

(def t {:node 7, 
     :children [{:node 8, :children []} 
        {:node 6, :children []} 
        {:node 23, :children []} 
        {:node 43, :children []}]}) 

要添加一个新的子注:

(defn add-child [tree node] 
    (assoc-in tree 
      [:children] 
      (conj (:children tree) node))) 

(add-child t :foo) 
;; => {:node 7, 
;;  :children [{:node 8, :children []} 
;;    {:node 6, :children []} 
;;    {:node 23, :children []} 
;;    {:node 43, :children []} 
;;    :foo]} 

中当然这不完全是我们想要的。

(defn make-node [value children] 
    (let [c (into [] children)] 
    {:node value 
    :children c})) 

(make-node 5 nil) 
;; => {:node 5, :children []} 

(make-node 5 [(make-node 3 nil) (make-node 7 nil)]) 
;; => {:node 5, 
;;  :children [{:node 3, :children []} 
;;    {:node 7, :children []}]} 

大厦树现在是合并make-node & add-child的问题。

如果你想在深层次上工作,我建议使用zipper

0

对于添加新节点,基本思路是一般的。无论如何,编需要知道在哪里放置新的孩子。当到达新孩子的父节点时,prog会将新孩子追加到它。其余的问题是如何在clojure中遍历一个图。 clojure.walk模块就是为了这个目的。

一个实现中增加一个新节点到图形的如下:

(defn tree-add 
    [root parent-key new-node] 
    (clojure.walk/postwalk #(if (= parent-key (:node %)) 
          (assoc % :children (conj (:children %) new-node)) 
          %) 
         root)) 

测试:

user> a 
{:node 7, :children [{:node 8, :children []}]} 
user> (tree-add a 7 {:node 99 :children []}) 
{:node 7, :children [{:node 8, :children []} {:node 99, :children []}]} 
user> (tree-add a 8 {:node 199 :children []}) 
{:node 7, :children [{:node 8, :children [{:node 199, :children []}]}]} 
相关问题