문자열을 구문 분석하는 재귀 방법

홍길동 :

내가 문자열이 "{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));
                }
            }
        }
    }

종료 로직 고투

그들은했다 :

'-'추가 할 경우 중첩의 깊이에 따라 문자를, 당신의 접두사의 추적 유지 재귀 호출에 두 번째 인수를 전달해야한다 '-'문자.

당신이 발생하는 경우 '{', 당신은 추가 '-'는 접두사.

당신이 발생할 때 '}', 당신은 제거 '-'는 접두사.

당신이 다른 문자가 발생하면 해당 문자 다음에 접두사를 인쇄 할 수 있습니다.

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

(-'s 나는 당신의 예상 출력 'D'의 4가 볼 '-'s,하지만 난 이후는 오류 생각'd는 C '와 같은 중첩 수준이'가 3 있어야한다, 그래서 ').

다음과 같은 방법도 쓸 수 있습니다 :

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);
}

추천

출처http://43.154.161.224:23101/article/api/json?id=363362&siteId=1