使用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)
有更优雅的方法吗?
答案 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(格式错误的字符串)。