[英]Build Map Using Recursive Function
該函數的想法是,它將構建一個包含鍵(路徑)和與該路徑相對應的數據的映射。 這就是為什么我在構建地圖時不斷將地圖傳回來的原因。
問題似乎是它到達了沒有子節點的地步,但仍將下一個路徑附加到當前路徑上:
路徑的輸入將始終以“ /”開頭。 我們為此得到了孩子,可能是level_1A,level_1C,level_1B。 然后,我遞歸查看它們是否有孩子。
假設級別_1A的子級為級別_2A,即級別_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
范圍內,因此在第一次迭代中,您已經修改了path變量,在第二次迭代中,已修改的值與第二個子級連接在一起,然后被更深地傳遞。
因此,只需提供for循環作用域變量並在迭代中使用它即可:
for(String child: children) {
String pathChild = path;
if(!path.equals("/")) {
pathChild = path + "/" + child;
} else {
pathChild = path + child;
}
//pathChild is used below
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.