2016-10-17 43 views
0

该函数的构思是它将构建一个包含键(路径)和与该路径对应的数据的映射。这就是为什么我继续将地图传回,因为它正在建造。使用递归函数构建地图

的问题似乎是,它得到那里有没有孩子的地步,但仍附加下一路径到当前路径:

输入的路径始终以“/”开头。我们为此获得了儿童,这可能是level_1A,level_1C,level_1B。然后,我会逐一检查他们是否有孩子。

假设level_1A有子级level_2A,level_2B。不知何故,该算法被逮住了,并追加像这样:

​​

然而,应该需单独治疗这些,就像这样:

/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

的错误是在这里:

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

path变量超出for loop范围,所以在第一次迭代你修改路径变量,并在修改后的值第二次迭代被串联起来的第二个孩子,然后已被深入传递。

所以只提供了循环范围的变量和重复使用它:

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

感谢Beloo!愚蠢的错误。 – Matt