2015-08-08 12 views
5

mam wyrażenie:Jak używać stosu do analizowania ciąg

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

Jak wybrać wartości wszystkich otaczających szelkami jeden po drugim, w każdym przejściu tak:

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

Tak pory robiłem to:

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

Ale problemem jest to, że nie wykrywa prawo } tak. Jak powinienem to robić?

wyjścia już teraz:

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

Nie jestem pewien, co chce zrobić. Czym jest "Section parentSectionObject"? Czy chcesz utworzyć drzewo lub po prostu wydrukować wszystkie elementy "{..}"? – Pshemo

+0

@Pshemo To cię obserwuje. Tak, tworzę strukturę drzewa dla wszystkich wyodrębnianych ciągów. – Identity1

+0

'" {\\ * \\ listtable {\\ list {\\ listlevel {\\ leveltext}}}} "to faktycznie węzeł główny. i 'list' następuje, a następnie' listLevel' – Identity1

Odpowiedz

1

rozwiązanie na stosie (problably może być prostsze, ale niech rozwiązać pierwszy problem):

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

Uwaga: biblioteka Guava Google jest potrzebne do TreeTraverser

Wyjście:

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

Edytuj 1: zmodyfikowano, aby utworzyć drzewo po DODATKOWE wejście od OP

Edycja 2: zmodyfikowany traktować rodzeństwo poprawnie

+0

Zaktualizowałem kod na podstawie ostatniego wpisu, teraz łańcuchy są przechowywane w drzewie. – mzc

+0

Nie umieściłem rodzeństwa w ostatnim ciągu znaków @mzc. W niektórych przypadkach nie działa z rodzeństwem. Zobacz dane wejściowe jako 'String stringContent =" {\\ * \\ listtable {\\ list {\\ listlevel {\\ leveltext} {\\ levelNumber}}}} "' gdzie 'leveltext' i' levelNumbers' to rodzeństwo – Identity1

+0

Wypróbuj to, powinno być naprawione – mzc

0

polecam Ci, zamiast za pomocą pętli for, utworzyć zmienną o nazwie I i zwiększyć ją w pętli while. Sprawdzasz "arr [i]! = '}" "W pętli while, ale ponieważ jest w pętli for, nigdy się nie zwiększa, dlatego zawsze sprawdza tę samą postać.

+0

Rekurencyjnie próbuję drążyć tekst za pomocą podciągu. Ale otrzymałem następujące powyżej * teraz zmodyfikowany – Identity1

+0

Spróbuj tego: http://pastebin.com/r6uRgnB4. Wyprowadza '{\ leveltext} {\ listlevel {\ leveltext}} {\ list {\ listlevel {\ leveltext}}} {\ * \ listtable {\ list {\ listlevel {\ leveltext}}}}' for mnie. – Emd4600

Powiązane problemy