2015-08-08 12 views
5

ho una stringa:Come utilizzare una pila per analizzare una stringa

String stringContent="{\\*\\listtable{\\list{\\listlevel{\\leveltext}{\\levelNumber}}}}" 

Come faccio a selezionare i valori di tutte le parentesi graffe che racchiudono uno per uno in ogni passaggio come questo:

"{\\levelNumber}" 
"{\\leveltext}" 
"{\\listlevel{\\leveltext}{\\levelNumber}}" 
"{\\list{\\listlevel{\\leveltext}}}" 
"{\\*\\listtable{\\list{\\listlevel{\\leveltext}}}}" 

Così lontano ho fatto questo:

public class StringExtracter { 

public String stringofObject(Section parentSectionObject, String stringContent) { 
    Stack stack=new Stack(); 
    String returnString = ""; 

    char arr[] = stringContent.toCharArray(); 


    for(int i=0;i<=arr.length;i++){ 

     while(arr[i]!='}'){ 
     if(arr[i]=='{'){ 
      stringContent=stringContent.substring(i+1); 
      returnString=stringContent; 
      System.out.println(stringContent); 
      braces=true; 
      Section sectionObject=new Section(parentSectionObject,stringContent); 
      stack.push(arr[i]); 


     }   

    } 
    return returnString; 
} 

Ma il problema è che non rileva il diritto } come questo. Come dovrei fare questo?

uscita fin d'ora:

\*\listtable{\list{\listlevel{\leveltext}{\fefw}}}} 
\list{\listlevel{\leveltext}{\fefw}}}} 
\listlevel{\leveltext}{\fefw}}}} 
\leveltext}{\fefw}}}} 
\fefw}}}} 
+0

Non sono sicuro di ciò che si sta cercando di fare. Cosa è 'Section parentSectionObject'? Vuoi creare un albero o semplicemente stampare tutti gli elementi '{..}'? – Pshemo

+0

@Pshemo Questo è l'osservatore di voi. Sì, sto creando una struttura ad albero per tutte le stringhe che sto estraendo. – Identity1

+0

'" {\\ * \\ listtable {\\ list {\\ listlevel {\\ leveltext}}}} "" è in realtà il nodo principale. e le 'liste' seguono e poi' listLevel' – Identity1

risposta

1

soluzione Stack-based (problably potrebbe essere più semplice, ma cerchiamo di risolvere il problema prima):

public class Main { 

    public static class Node { 
     public int level; 
     public String content = ""; 
     public List<Node> children = new ArrayList<>(); 
    } 

    public static void main(String[] args) { 

     String input="{\\\\*\\\\listtable{\\\\list{\\\\listlevel{\\\\leveltext}{\\\\levelNumber}}}}"; 

     Node root = null; 
     Stack<Node> stack = new Stack<>(); 

     for(char c: input.toCharArray()) { 
      if (c == '{') { 
       Node n = new Node(); 
       n.level = stack.size() + 1; 
       n.content += c; 
       stack.push(n); 
       if (root == null) root = n; 
      } else if (c == '}') { 
       Node n = stack.pop(); 
       n.content += c; 
       if (!stack.isEmpty()) { 
        stack.peek().children.add(n); 
       } 
      } else { 
       stack.peek().content += c; 
      } 
     } 

     TreeTraverser<Node> treeTraverser = new TreeTraverser<Node>() { 
      @Override 
      public Iterable<Node> children(Node root) { 
       return root.children; 
      } 
     }; 

     for(Node node : treeTraverser.preOrderTraversal(root)) { 
      String indent = String.format("%" + node.level + "s", " "); 
      System.out.println(indent + node.content); 
     } 
    } 
} 

Nota: biblioteca Guava di Google è necessaria per l'uscita TreeTraverser

:

{\\*\\listtable} 
    {\\list} 
    {\\listlevel} 
    {\\leveltext} 
    {\\levelNumber} 

Modifica 1: modificato per creare un albero dopo un Ingresso ltre dall'OP

Edit 2: modificato per trattare i fratelli correttamente

+0

Ho aggiornato il codice in base all'ultimo input, ora le stringhe sono memorizzate in un albero. – mzc

+0

Non ho inserito i fratelli nella stringa di input l'ultima volta @mzc. In alcuni casi non funziona con i fratelli. Vedi l'input come 'String stringContent =" {\\ * \\ listtable {\\ list {\\ listlevel {\\ leveltext} {\\ levelNumber}}}} "" dove 'leveltext' e' levelNumbers' sono fratelli – Identity1

+0

Provalo, dovrebbe essere corretto – mzc

0

vi consiglio di, invece di utilizzare un ciclo for, creare una variabile denominata i e aumentarla nel ciclo while. Stai cercando "arr [i]! = '}'" Nel ciclo while, ma dato che è all'interno del ciclo for, non aumenterò mai, e quindi controllerà sempre lo stesso personaggio.

+0

Sto provando a ricomporre in modo ricorsivo il testo usando la sottostringa. Ma ottengo il seguente sopra a partire da ora * modificato – Identity1

+0

Prova questo: http://pastebin.com/r6uRgnB4. Visualizza '{\ leveltext} {\ listlevel {\ leveltext}} {\ list {\ listlevel {\ leveltext}}} {\ * \ listtable {\ list {\ listlevel {\ leveltext}}}}' per me. – Emd4600

Problemi correlati