使用递归函数构建映射

时间:2016-10-17 15:12:03

标签: java recursion hashmap apache-zookeeper

该功能的想法是它将构建一个包含密钥(路径)和与该路径对应的数据的映射。这就是为什么我继续将地图传递回来的原因。

问题似乎是它没有孩子,但仍然将下一条路径附加到当前路径:

路径的输入始终以“/”开头。我们得到了孩子,这可能是level_1A,level_1C,level_1B。然后我对每一个都进行了测试,看看他们是否有孩子。

假设level_1A有子级level_2A,level_2B。不知怎的,算法被赶上了,并且如下所示:

/level_1A/level_2B/level_2A

然而,它应该单独对待这些,如下:

/level_1A/level_2A
/level_1A/level_2B

以下是整个结构的样子:

/level_1A            data_1A
/level_1A/level_2A   data_2A
/level_1A/level_2B   data_2B

/level_1B            (empty)

/level_1C            (empty)

这是递归方法:

public Map<String, String> getAll(String path, Map<String, String> all) throws Exception {

        List<String> children = client.getChildren().forPath(path);

        if(children != null && children.size() > 0) {

            for(String child: children) {
                                                                                                    System.out.println("child: " + child);
                if(!path.equals("/")) { 
                    path = path + "/" +  child;
                } else {
                    path = path + child;
                }

                Stat stat = client.checkExists().watched().forPath(path);

                if(stat != null && stat.getDataLength() > 0) {
                    all.put(path, new String(client.getData().forPath(path)));
                }

                getAll(path, all);
            }

        } 

    return all;
}

1 个答案:

答案 0 :(得分:1)

错误在于:

 for(String child: children) {           
     if(!path.equals("/")) { 
         path = path + "/" +  child;
     } else {
         path = path + child;
     }
     ...
 }

path变量超出for loop范围,因此在第一次迭代中,您修改了路径变量,在第二次迭代中,修改后的值与第二个子项连接,然后更深入地传递。

所以只需提供for循环范围变量并在迭代中使用它:

 for(String child: children) {
     String pathChild = path;           
     if(!path.equals("/")) { 
         pathChild = path + "/" +  child;
     } else {
         pathChild = path + child;
     }
     //pathChild is used below
     ...
 }