2009-05-01 3 views
1

mit Java Ich versuche, eine Methode zu entwickeln, die Rekursion einen String der Form zu analysieren, mit:Splitting ein String in kleinere Teile auf Basis von Parens

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

Ich möchte das Verfahren die relevanten Strings aufteilen auseinander. Ich möchte diese Methode mir die Möglichkeit zu geben, eine gewisse Logik auf jedem Teil des String auszuführen, ohne die Klammern in dieser Reihenfolge beteiligt: ​​

PART2 
PART3 
PART1 
PART0 

Hier ist, was meine Methode, die derzeit wie folgt aussieht:

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

    } 
} 
Hier

ist, was meine Ausgabe so weit ist:

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

im Grunde ist es bricht an dieser Stelle nach unten: PART1 (PART2) (PART3)

Gibt es einen eleganteren Weg, dies zu tun?

Antwort

11

Verschachtelte Kontexte funktionieren am natürlichsten wie ein Stapel.

-Jeder Mal einen neuen Kontext starten (Begegnung '(') push()

-Jeder Mal einen Zusammenhang beenden (Begegnung ')') pop()

-Jeder pop() entsprechen wird dann dem vollständigen Kontext

dh:

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

Sie würden wahrscheinlich wollen auch einige Fehler hinzufügen Überprüfung, das heißt, wenn es keinen Zusammenhang oder Pop zu drücken ist dann haben Sie, m Ismatched Parens (missgebildete Zeichenfolge).