簡體   English   中英

使用遞歸函數構建地圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM