当前位置: 首页 > 知识库问答 >
问题:

如何更改Java中递归函数的执行顺序?

何禄
2023-03-14

我正在尝试使用JavaDOM解析器为XML文档中的许多标记建立索引,以从中形成类似MIB的结构(例如

<module>
    <container>
        <list>
            <leaf></leaf>
            <leaf></leaf>
... 

我希望将模块映射到1,将容器映射到1.1,将列表映射到1.1.1,将叶映射到1.1.1.1,将另一个叶映射到1.1.1.2(我已经有了这样做的方法),但在嵌套相同命名的XML标记时,我遇到了问题。以下是我创建的函数——为了简单起见,只需打印属性名

public static void traverse(Node node) {
    NodeList nodeList = node.getChildNodes();
    for (int i = 0; i < nodeList.getLength(); i++) {
        // gets the current node
        Node currentNode = nodeList.item(i);

        if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
            traverse(currentNode);
        }

        if (currentNode.getNodeName().equals("container")) {
            for (int j = 0; j < currentNode.getChildNodes().getLength(); j++) {
                if (currentNode.getChildNodes().item(j).getNodeType() == Node.ELEMENT_NODE) {
                    Element e = (Element) currentNode.getChildNodes().item(j);
                    System.out.println(e.getAttribute("name") + " "
                            + currentNode.getChildNodes().item(j).getNodeName());
                }
            }
        }
    }
}

下面是我试图解析的XML示例:

<container name="alarm">
    <list name="config">
        <leaf name="source">
            <type name="larmSourceType" />
            <description>
                <text>The name</text>
            </description>
            <mandatory value="true" />
        </leaf>
        <leaf name="name">
            <type name="atNameType" />
            <description>
                <text>fies each alarm within the named alarm source</text>
    </list>
    <container name="stat">
        <leaf name="currentActiveAlarms">
            <type name="atc:alarmCounterType" />
        </leaf>
    </container>
</container>

当我在这个程序上运行我的方法时,输出显示第二个嵌套容器节点首先被执行,其中的所有叶子都被打印出来。而我想打印所有从第一个容器,然后第二个。

我希望这有意义?P. S很抱歉格式化,我不明白。谢啦

共有1个答案

东方俊杰
2023-03-14

交换代码,以便先处理当前节点,然后遍历

public static void traverse(Node node) {
    NodeList nodeList = node.getChildNodes();
    for (int i = 0; i < nodeList.getLength(); i++) {
        // gets the current node
        Node currentNode = nodeList.item(i);

        // Do stuff with current node first
        if (currentNode.getNodeName().equals("container")) {
            for (int j = 0; j < currentNode.getChildNodes().getLength(); j++) {
                if (currentNode.getChildNodes().item(j).getNodeType() == Node.ELEMENT_NODE) {
                    Element e = (Element) currentNode.getChildNodes().item(j);
                    System.out.println(e.getAttribute("name") + " "
                            + currentNode.getChildNodes().item(j).getNodeName());
                }
            }
        }

        // traverse deeper after having done stuff with current node (above)
        if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
            traverse(currentNode);
        }
    }
}

这将在其子节点之前打印父节点,而不是反过来打印。

 类似资料:
  • 让我们举这个例子 js编译器知道所有的函数声明,所以我可以在< code > main < code > main(second())内部调用< code>second。我不明白递归函数是如何在函数声明内部调用同一个函数的 我的思考过程是:好吧,这是函数声明,这是函数所做的,但是如何 即使声明没有完成,我也可以调用相同的函数

  • 我试图建模双向亲子设计,有秩序的孩子。 从父级中删除子级(例如,子级#2/3子级)时,hibernate生成的sql会导致唯一的约束冲突,因为“更新”(同级)是在“删除”(目标)之前执行的。 我使用的RDBMS(H2)不支持延迟约束。除了以下选项外,我还有哪些选择? 从架构中删除唯一约束 自己显式管理排序,而不是依赖hibernate 有什么方法可以让Hibernate生成sql,在更新之前删除吗

  • 问题内容: 这是一个程序,它使用递归和执行程序来读取以前格式的信息站点。它工作正常,我的问题是测试程序是否完成和成功通知。 如果 levels.length = 1 ,则规则执行器运行良好,但是如果 levels.length > 1将出现错误:线程“ pool-1-thread-138”中的异常java.util.concurrent.RejectedExecutionException 问题答

  • 我还不太理解递归,我有一些作业我不能解决。有人有主意吗? 任务1:实现一个int方法max(int[]arr,int i),该方法返回arr中所有元素的最大值和索引 这是我迄今为止的代码: 实际上它是有效的,但它的风格很差,所以我的问题是:如果没有私有静态int max,我如何实现递归方法?我不允许向该方法添加第三个参数。 任务2:实现一个布尔方法包含值(int[]arr,int val),如果a

  • 在我的progress函数中,它将到达递归的底部,但是我期望返回的值没有改变。 这应该返回true,它符合条件(记录文本),但随后继续移动,并且始终返回false。

  • 问题内容: 现在,如果我执行上面的语句,它将按顺序运行。在我的实际用例中,数组是动态填充的,我需要为中的每个成员执行函数。 我如何制作一个“暂停循环”,该循环将为数组中的每个项目循环,执行并等待promise被解决,然后再继续下一次迭代? 问题答案: 如果可以按问题中的情况创建与数组元素一样多的Promise,则可以整齐地重复应用fold。 但是,例如,异步函数不需要: 内置在优秀承诺库Blueb