2016-10-17 42 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