2016-10-17 3 views
0

Идея функции заключается в том, что она построит карту, содержащую ключ (путь) и данные, соответствующие этому пути. Вот почему я продолжаю передавать карту, когда она строится.Строение карты с использованием рекурсивной функции

Проблема, кажется, что он попадает в точку, где нет детей нет, но все еще дописывает следующий путь на пути тока:

Вход для пути всегда будет начинаться с «/». Мы получаем для этого детей, которые могут быть level_1A, level_1C, level_1B. Затем я рекурсию по каждому из них, чтобы посмотреть, есть ли у них дети.

Предположим, у level_1A был ребенок 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; 
} 

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^