【问题标题】:A vector of maps into a tree映射到树中的向量
【发布时间】:2018-07-23 18:11:17
【问题描述】:

我有一个具有以下结构的集合 [{:a 0} {:b 1} {:c 1} {:d 2} {:e 3} {:f 2}]。基本上,它是一棵树,其中向量的一个元素是一个节点。数字表示的是父子关系。因此,元素 {:a 0} 是主父元素(没有父元素),而 {:b 1}、{:c 1} 是 {:a 0} 的子元素。此外,{:d 2} 是 {:c 1} 的子代。

我想要的是构造一个具有以下结构的列表或向量(此时无关紧要): [{:a {:b nil :c {:d {:e nil} :f nil}}}]。

如何做到这一点?

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 你怎么知道dbc 的孩子? (f 的问题相同)
  • 老实说,我没有。但是,我的想法是让函数查看每个元素,并查看前一个元素的值是否小于 1。如果是这样,它就是它的父级。如果不是,那么我会查看前两步的那个,依此类推。但我无法构建这样的功能。
  • @jas。在我感兴趣的结构中,d 是 c 的子元素,因为它是最接近 d 的元素。
  • 有道理 --- 我现在可以看到它正在按照深度优先路径构建树。

标签: dictionary vector clojure


【解决方案1】:

这应该可行:

(fn [xs]
  (loop [[x & rs :as xs] xs
         m   {}
         lvl {}]
    (if (seq xs)
      (let [[k l] (first x)
            p (conj (lvl (dec l) []) k)]
        (recur
          rs
          (assoc-in m p nil)
          (assoc lvl l p)))
      m)))

正如@jas 提到的,我们不能依赖映射的键顺序,所以这里我们使用lvl 映射来保持每个级别最后看到的元素的路径。

【讨论】:

  • 谢谢。这正是我所需要的。
  • @HassanShahin 如果是正确答案,别忘了接受答案
  • 非常抱歉。我投票给了答案,但忘记接受了。 :)
  • @Olim-Saidov 当条目是唯一的时,您的解决方案对我来说效果很好。当他们不是时,它会失败。考虑这个向量 [{"html" 0} {"body" 1} {"aside" 2} {"menu" 3} {"menuitem" 4} {"menuitem" 4} {"menuitem" 4} {"menuitem" 4} {"menuitem" 4} {"div" 2} {"title" 3} {"img" 3} {"p" 3} {"link" 3} {"form" 2} {nil 3} {"按钮" 3} {"div" 3} {"p" 4} {"title" 4} {"link" 4} {"footer" 1} {"a" 2} {"a" 2} {"a" 2} {"a" 2}] 结果只包含一个“menuitem”和一个“a”。我想知道是否可以修改它以考虑这种情况。
  • 你觉得结果数据结构如何?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
相关资源
最近更新 更多