我在尝试使用嵌套分隔符拆分字符串时遇到了一些麻烦。
我的字符串就像"(a,b(1,2,3),c,d(a,b,c))"
.
如何获得["a","b(1,2,3)","c","d(a,b,c)"]
数组?
我显然不能使用 .split(",")
,因为它也会拆分我的子字符串。
这是一个直接的非递归函数,它以您想要的方式拆分字符串:
private String[] specialSplit(String s) {
List<String> result = new ArrayList<>();
StringBuilder sb = new StringBuilder();
int parenCount = 0;
for (int i = 1; i < s.length() - 1; i++) { // go from 1 to length -1 to discard the surrounding ()
char c = s.charAt(i);
if (c == '(') parenCount++;
else if (c == ')') parenCount--;
if (parenCount == 0 && c == ',') {
result.add(sb.toString());
sb.setLength(0); // clear string builder
} else {
sb.append(c);
}
}
result.add(sb.toString());
return result.toArray(new String[0]);
}
基本上,我们遍历字符串的所有字符,跟踪括号。不考虑第一个和最后一个括号。只有当我们看到相同数量的左括号和右括号并且当前字符为","时,我们才会拆分字符串。
此方法的运行速度可能比您可能找到的任何正则表达式都要快得多。
归函数应该在这里工作,只是不能使用普通split()
。尝试逐个字符解析字符串,并在遇到逗号或偏执时采取行动:,
表示您创建一个新元素,(
开始一个新的嵌套列表,)
表示您完成了当前的嵌套列表。这甚至应该与更"展开"的方法一起使用(即没有递归,而是处理数据结构中的嵌套(。