繁体   English   中英

如何在Clojure中向哈希映射图添加新节点?

[英]How to Add a New Node to Hash-Map Graph in 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,

让我们将树分配给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-nodeadd-child

如果您想处理较深的层次结构,建议您使用拉链

对于添加新节点,基本思想是一般性的。 无论如何,编要知道将新孩子放在哪里。 当到达新子节点的父节点时,编会将新子节点追加到该子节点。 剩下的问题是如何在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 []}]}]}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM