使用递归函数构建地图
Build Map Using Recursive Function
该函数的想法是构建一个包含键(路径)和与该路径对应的数据的映射。这就是为什么我在构建地图时一直将其传回的原因。
问题似乎是它到了没有 children 的地步,但仍然将下一个路径附加到当前路径:
路径的输入将始终以“/”开头。我们为此得到了children,它可能是level_1A、level_1C、level_1B。然后我对其中的每一个进行递归,看看它们是否有 children.
假设 level_1A 有 children 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;
}
错误在这里:
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
...
}
该函数的想法是构建一个包含键(路径)和与该路径对应的数据的映射。这就是为什么我在构建地图时一直将其传回的原因。
问题似乎是它到了没有 children 的地步,但仍然将下一个路径附加到当前路径:
路径的输入将始终以“/”开头。我们为此得到了children,它可能是level_1A、level_1C、level_1B。然后我对其中的每一个进行递归,看看它们是否有 children.
假设 level_1A 有 children 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;
}
错误在这里:
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
...
}