2015-08-08 7 views
5

मैं एक स्ट्रिंग है एक ढेर उपयोग कैसे करें:एक स्ट्रिंग पार्स करने

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

मैं कैसे एक के बाद सभी संलग्न ब्रेसिज़ एक के मान का चयन करना प्रत्येक में इस तरह से पारित:

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

तो जहाँ तक मुझे ऐसा करने के बाद:

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

लेकिन समस्या यह है कि यह सही } इस तरह का पता लगाने के नहीं है। मुझे यह कैसे करना चाहिए? अब तक

आउटपुट:

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

मुझे यकीन है कि आप क्या करने की कोशिश कर रहे हैं नहीं कर रहा हूँ संशोधित। 'धारा parentSectionObject' क्या है? क्या आप पेड़ बनाना चाहते हैं या बस सभी '{..}' तत्वों को मुद्रित करना चाहते हैं? – Pshemo

+0

@Pshemo Thats आप का पालन करते हैं। हां, मैं निकालने वाले सभी तारों के लिए एक वृक्ष संरचना बना रहा हूं। – Identity1

+0

'" {\\ * \\ listtable {\\ list {\\ listlevel {\\ leveltext}}}} "वास्तव में रूट नोड है। और 'सूचियों' का पालन करें और फिर 'listLevel' – Identity1

उत्तर

1

ढेर आधारित समाधान (problably आसान हो सकता है, लेकिन समस्या पहले हल करते हैं):

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

टिप्पणी: Google की अमरूद पुस्तकालय TreeTraverser

आउटपुट के लिए आवश्यक है:

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

संपादित करें 1: एक पेड़ बनाने के बाद संशोधित ओपी

संपादित 2 से dditional इनपुट: भाई बहन के इलाज के लिए सही ढंग से

+0

मैंने आपके अंतिम इनपुट के आधार पर कोड अपडेट किया है, अब तार एक पेड़ में संग्रहीत हैं। – mzc

+0

मैंने पिछली बार @mzc इनपुट स्ट्रिंग में भाई बहन नहीं डाले। यह कुछ मामलों में भाई बहनों के साथ काम नहीं करता है। इनपुट को 'स्ट्रिंग स्ट्रिंग सामग्री =' {\\ * \\ listtable {\\ list {\\ listlevel {\\ leveltext} {\\ levelNumber}}}} के रूप में देखें "जहां' लेवलटेक्स्ट' और 'लेवल नब्स' भाई बहन हैं – Identity1

+0

इसे आज़माएं, इसे ठीक किया जाना चाहिए – mzc

0

मैं पाश के लिए एक उपयोग करने के बजाय, एक चर मैं कहा जाता है बना सकते हैं और जबकि पाश में यह वृद्धि करने के लिए आप सलाह देते हैं,। आप लूप में "arr [i]! = '}'" की जांच कर रहे हैं, लेकिन जैसा कि यह लूप के अंदर है, मैं कभी नहीं बढ़ता, और इसलिए यह हमेशा एक ही चरित्र की जांच करता है।

+0

मैं प्रतिलिपि का उपयोग कर पाठ को ड्रिल करने की कोशिश कर रहा हूं। लेकिन मुझे अब निम्न के रूप में उपरोक्त मिलता है * संशोधित – Identity1

+0

इसे आज़माएं: http://pastebin.com/r6uRgnB4। यह '{\ leveltext} {\ listlevel {\ leveltext}} {\ list {\ listlevel {\ leveltext}}} {\ * \ listtable {\ list {\ listlevel {\ leveltext}}}} के लिए आउटपुट करता है मुझे। – Emd4600

संबंधित मुद्दे