根据父母将字符串拆分为较小的部分

时间:2009-05-01 02:02:04

标签: java algorithm language-agnostic string

使用java我正在尝试使用递归来开发一个方法来分析表单的字符串:

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

我希望该方法拆分相关的字符串。我希望这个方法能够让我在字符串的每个部分上执行一些逻辑,而不会在这个顺序中使用括号:

PART2
PART3
PART1
PART0

以下是我的方法目前的样子:

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

     }
}

到目前为止我的输出是什么:

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

基本上它在这部分分解:PART1(PART2)(PART3)

有更优雅的方法吗?

1 个答案:

答案 0 :(得分:11)

嵌套上下文最自然地作为堆栈工作。

- 每次你开始一个新的上下文(遇到'(')push()

- 每次退出上下文(遇到')')pop()

- 每个pop()将对应完整的上下文

即:

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

你可能也想添加一些错误检查,即如果没有上下文推送或弹出,那么你就会得到不匹配的parens(格式错误的字符串)。