如何使用堆栈来解析字符串

时间:2015-08-08 10:27:40

标签: java string stack rtf

我有一个字符串:

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

2 个答案:

答案 0 :(得分:1)

基于堆栈的解决方案(可能更简单,但让我们先解决问题):

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

注意:TreeTraverser需要Google的Guava库

输出:

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

编辑1 :修改为在OP的其他输入后创建树

编辑2 :已修改为正确处理兄弟姐妹

答案 1 :(得分:0)

我建议你,而不是使用for循环,创建一个名为i的变量,并在while循环中增加它。您正在检查&#34; arr [i]!=&#39;}&#39;&#34;在while循环中,但是因为它在for循环中,我从不增加,因此它总是检查相同的字符。