首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Clojure中向Hash-Map图添加一个新节点?

如何在Clojure中向Hash-Map图添加一个新节点?
EN

Stack Overflow用户
提问于 2015-04-27 14:29:22
回答 2查看 181关注 0票数 1

我在Clojure中创建了以下数组映射。

代码语言:javascript
复制
{:node 7, :children [{:node 8, :children []} {:node 6, :children []} {:node 23, :children {}} {:node 43, :children []}]}

如何在其中添加元素,运行以下代码

代码语言:javascript
复制
(def tree (assoc-in tree [:node] 12))

给我

代码语言:javascript
复制
{:node 12, :children [{:node 8, :children []} {:node 6, :children []} {:node 10, :children {}} {:node 13, :children []} {:node 28, :children []}]}`

和奔跑

代码语言:javascript
复制
(def tree (assoc-in tree [:node :children] 12))

给我以下错误信息。如何将元素添加到数组映射的子部分中?

代码语言:javascript
复制
Exception in thread "main" java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.Associative,
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-27 16:54:35

让我们把树分配给t

代码语言:javascript
复制
(def t {:node 7, 
        :children [{:node 8, :children []} 
                   {:node 6, :children []} 
                   {:node 23, :children []} 
                   {:node 43, :children []}]})

若要添加新的子注释,请执行以下操作:

代码语言:javascript
复制
(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]}

当然,这不是我们想要的。

代码语言:javascript
复制
(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相结合的问题。

如果您想要处理深度层次结构,我建议使用拉链

票数 3
EN

Stack Overflow用户

发布于 2015-06-18 15:35:05

对于添加一个新节点,基本思想是通用的。不管怎么说,程序需要知道把新来的孩子放在哪里。当到达新子节点的父节点时,prog会将新的子节点追加到它。剩下的问题是如何在clojure中遍历一个图。clojure.walk模块就是为此目的而设计的。

将新节点添加到图中的一个实现如下:

代码语言:javascript
复制
(defn tree-add
  [root parent-key new-node]
  (clojure.walk/postwalk #(if (= parent-key (:node %))
                            (assoc % :children (conj (:children %) new-node))
                            %)
                         root))

测试:

代码语言:javascript
复制
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 []}]}]}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29898557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档