2009-05-01 2 views
1

Использование Java Я пытаюсь разработать метод с использованием рекурсии для анализа строки вида:Разбиение строки на более мелкие части основаны на Паренс

(PART0(PART1(PART2)(PART3))) 

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

PART2 
PART3 
PART1 
PART0 

Вот что в настоящее время выглядит мой метод, как:

private void check(String stmt) throws Exception { 

    System.out.println(stmt); 
    int firstIndex = 0; 
    int lastIndex = 0; 
    while(firstIndex !=-1){ 
     firstIndex = stmt.indexOf('('); 
     lastIndex = stmt.lastIndexOf(')'); 

     check(stmt.substring(firstIndex+1,lastIndex)); 

    } 
} 

Вот что мой выход до сих пор:

(PART0(PART1(PART2)(PART3))) 
PART0(PART1(PART2)(PART3)) 
PART1(PART2)(PART3) 
PART2)(PART3 

в основном это ломается в этой части: PART1 (PART2) (PART3)

Есть ли более элегантный способ сделать это?

ответ

11

Вложенные контексты работают наиболее естественно как стек.

-Каждый раз, когда вы начинаете новый контекст (наталкиваются '(') толчок()

-Каждый раз, когда вы выходите из контекста (наталкиваются ')') поп()

-Каждый поп() будет соответствовать полному контексту

т.е.

public static void main(String args[]) 
    { 
     String s = "(PART0(PART1(PART2)(PART3)))"; 
     Stack<StringBuilder> stack = new Stack<StringBuilder>(); 
     StringBuilder curr = null; 
     for (int i = 0; i < s.length(); i++) 
     { 
      char c = s.charAt(i); 
      if (c == '(') 
      { 
       curr = new StringBuilder(); 
       stack.push(curr); 
      } 
      else if (c == ')') 
      { 
       System.out.println(stack.pop()); 
      } 
      else 
      { 
       curr.append(c); 
      } 
     } 
    } 

вы, вероятно, хотите, чтобы добавить некоторые проверки ошибок, а также, то есть, если нет никакого контекста, чтобы подтолкнуть или поп-то вы получили м Исправлены парсы (неправильная строка).

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