【问题标题】:Java Object graph validationJava 对象图验证
【发布时间】:2014-04-28 06:39:16
【问题描述】:

我有 java 对象 Map<Integer, SortedMap<Integer, Pair<Integer, String>>> 数据。我将此对象传递给递归方法以构建上述地图中每个键的对象。请看下面的例子。

例如,

<1 - <1, Pair<1, 'A'>>

<2 - <1, Pair<1, 'A'>>
     <2, Pair<2, 'B'>>

我想检查上图的循环依赖。请看下面的例子。

<9994 - <1, Pair<9995, 'X'>>
        <2, Pair<2, 'B'>>

<9995 - <1, Pair<9994, 'Y'>>
        <2, Pair<2, 'B'>>

9994 以上包含 9995,9995 包含 9994。这是无效的,应该会导致程序出错。

谁能建议我执行此验证的最佳方法?

谢谢。

私有静态布尔验证( 地图>输入, 设置对象)抛出异常 { 布尔结果 = true; for (对 cal : input.values()) { if (!object.add(cal.left)) 返回假; 结果 = 验证(获取(cal.left),对象); } 返回结果; }

【问题讨论】:

    标签: java recursion


    【解决方案1】:

    循环依赖的检查可以通过Depth-first-search来实现。为此,必须将要检查的对象更改为包含一个标志(这将指示它们是否已被访问过),或者某些辅助数据结构(如列表或哈希图)将包含已访问的节点。

    【讨论】:

    • 你能举例说明我如何在这里使用 dfs 吗?
    • 99949995 将被标记为“未访问”。然后,9994 将被标记为“已访问”。现在将访问9994 的所有孩子;唯一的孩子是99959995 将被标记为“已访问”,其子项将被访问。 9995 将被检查,但它已经被访问过;该过程将停止,因为我们已经有一个循环。
    • 请将这段代码移到提供合适格式的原始问题中。
    【解决方案2】:

    我建议,您使用递归函数将键放入 HashSet。如果插入成功,则 HashSet "add" 方法返回 true,否则返回 false。因此,如果有重复的 add 方法将返回 false。您可以将其用作您的验证。

    如果您可以发布一些初始代码 sn-p,我们可以尝试帮助解决此问题。

    http://docs.oracle.com/javase/7/docs/api/java/util/Set.html

    【讨论】:

    • 将键放入 HashSet 将不起作用,因为内部 SortedMapmap 中的键可以有重复的键。例如。下面是一个有效的例子。 > > > >
    【解决方案3】:

    您可以在所有级别的递归中跟踪集合中访问过的节点。处理前检查节点是否已被访问。

    【讨论】:

    • 你能在这里举个例子吗?
    • 说节点有数据并链接到其他节点,维护您在集合中访问的节点。例如:Collection 访问过; void process(Node node, Collectionvisited) { if(!visited.contains(node)) { //做一些处理;访问过的.add(节点);进程(node.getChild(),已访问);}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多