Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vector 如何在Clojure中向哈希映射图添加新节点?_Vector_Clojure_Array Map - Fatal编程技术网

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

Vector 如何在Clojure中向哈希映射图添加新节点?,vector,clojure,array-map,Vector,Clojure,Array Map,我在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 []}

我在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 []}]}
构建树现在是一个组合
生成节点
添加子节点
的问题


如果您想处理深层层次结构,我建议使用。

让我们将树分配给
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 []}]}
构建树现在是一个组合
生成节点
添加子节点
的问题


如果您想处理深层层次结构,我建议使用。

来添加新节点,基本思想是通用的。无论如何,prog需要知道在哪里放置新的孩子。当到达新子节点的父节点时,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 []}]}]}

对于添加新节点,基本思路是一般性的。无论如何,prog需要知道在哪里放置新的孩子。当到达新子节点的父节点时,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 []}]}]}

(def tree(树[{:node:children}]12中的assoc))运行,它给了我
{{:node:children}12,:node 7,:children[{:node 8,:children{}}{:node 6,:children{}{:node 23,:children{}{:node 43,:children}}}]
您是否正在尝试更新节点12的子节点?我实际上正在尝试以
{:node 8,:children{}}
的格式将一个新的子节点插入到:node 7的子节点中,但是我无法使其工作,因此我尝试只插入一个数字,以显示生成的树是什么样子的?(def tree(assoc in tree[{:node:children}]12)运行,这给了我
{{:node:children}12,:node 7,:children[{:node 8,:children{}}{:node 6,:children{}{}{:node 23,:children{}{:node 43,:children{}]}
您是否正在尝试更新节点12的子节点?我实际上正在尝试以
的格式将一个新的子节点插入到:node 7的子节点中{:node 8,:children{}
但是我无法让它工作,所以我尝试只插入一个数字作为时间been,结果树是什么样子的?