Рекурсивный способ разбора строки - PullRequest
1 голос
/ 14 января 2020

У меня есть строка "{x {y} {a {b {c} {d}}}}", и я хочу распечатать рекурсивно.

x
-y
-a
--b
---c
---d

Это то, что я имею до сих пор -

private static void printPathInChild2(String path) {

        if (path.length() == 0) {
            return;
        }
        if (path.charAt(0) == '{') {
            for (int i = 0; i < path.length(); i++) {
                if (path.charAt(i) == '{' && i != 0) {
                    String t1 = path.substring(0,i);
                    System.out.println(t1);
                    printPathInChild2(path.substring(i));
                } else if (path.charAt(i) == '}') {
                    String t2 = path.substring(0, i+1);
                    System.out.println(t2);
                    printPathInChild2(path.substring(i+1));
                }
            }
        }
    }

Борьба с логикой завершения c

1 Ответ

2 голосов
/ 14 января 2020

Если вы хотите добавить символы «-», которые зависят от глубины вложения, вы должны передать второй аргумент рекурсивному вызову, который отслеживает префикс символов «-».

Когда вы встречаете «{», вы добавляете «-» к префиксу.

Когда вы встречаете «}», вы удаляете «-» из префикса.

Когда вы встречая любой другой символ, вы печатаете префикс, за которым следует этот символ.

private static void printPathInChild2(String path,String prefix) {
    if (path.length() == 0) {
        return;
    }
    if (path.charAt(0) == '{') {
      printPathInChild2(path.substring(1),prefix + "-");
    } else if (path.charAt(0) == '}') {
      printPathInChild2(path.substring(1),prefix.substring(0,prefix.length()-1));
    } else {
      System.out.println (prefix.substring(1) + path.charAt(0));
      printPathInChild2(path.substring(1),prefix);
    }
}

Когда вы вызываете этот метод с помощью:

printPathInChild2("{x{y}{a{b{c}{d}}}}","");

Вы получаете:

x
-y
-a
--b
---c
---d

(Я вижу, что в вашем ожидаемом выводе 'd' имеет 4 ', но я думаю, что это ошибка, поскольку' d 'имеет тот же уровень вложенности, что и' c ', поэтому он должен иметь 3' - ' s).

Метод также можно записать следующим образом:

private static void printPathInChild2(String path,String prefix) {
    if (path.length() == 0) {
        return;
    }
    char c = path.charAt(0);
    if (c == '{') {
      prefix = prefix + '-';
    } else if (c == '}') {
      prefix = prefix.substring(0,prefix.length()-1);
    } else {
      System.out.println (prefix.substring(1) + c);
    }
    printPathInChild2(path.substring(1),prefix);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...