【问题标题】:How can i pinpoint a circular object reference in a large collection of objects?如何在大量对象中查明循环对象引用?
【发布时间】:2017-08-02 08:38:00
【问题描述】:

我正在从外部来源检索并复制大量文件夹对象。它们都有一个文件夹 ID 和一个父文件夹 ID,但不是树结构。检索它们后,我将它们组织在树节点对象中,并具有顶部根。但是,一个或多个文件夹会创建循环引用,我无法确定如何确定位置。

Java 在创建循环引用时不会抛出任何错误。当我尝试将其编码为 json 格式,然后将其发送到 Web 应用程序的客户端时,该错误作为 stackoverflow 错误出现。因为错误首先对我可见,所以我根本看不到哪个对象是导致错误的原因。

在这个特殊的问题上,我不知所措。是否有任何标准化的或好的识别循环对象引用的方法,比如我的例子?

【问题讨论】:

  • 一个文件夹可以有多个父文件夹吗?您谈论文件夹对象。它是子父关系的集合还是只有一个父对象的文件夹对象?
  • 只有一位家长。我发现错误出在我自己的精炼代码中,而不是在对象引用中。
  • 我在想。如果每个节点都有一个父节点,我不确定您是如何构建对象树的。除非您找到所有根节点,否则很难做到,然后继续添加已实例化父节点的节点,依此类推。如果有循环,您将在树中没有父节点的节点结束。那是因为它们形成了循环。循环几乎弹出算法的结尾。
  • 我从一开始就知道我想要哪个文件夹 id 作为根。然后我简单地制作一个哈希图,以文件夹 id 作为键,并将所有文件夹对象放在那里,但同时,我将它们包装在节点对象中,这有可能定义子文件夹。之后,我浏览所有原始文件夹对象,找到 id 和父 id,然后在地图上使用这两个,将每个文件夹添加到它的父文件夹。然而,我的代码确实有一个错误,所以我最终将一个文件夹节点设置为它自己的子文件夹。
  • 最后,我只是检索我知道的根,然后将它及其现在定义的树结构以 json 格式发送到客户端。

标签: java circular-reference


【解决方案1】:

向节点类添加一个“已访问”布尔标志,初始化为 false。遍历树。如果在给定节点处,当您到达时标志为真,则您检测到循环。否则将标志设置为 true 并继续遍历树。使用哪种遍历顺序没有区别(前=后序或中序)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 2015-12-24
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    相关资源
    最近更新 更多