我们可以先自己模拟一下分隔字符串的过程。如果只是简单的,遇到分隔符,将分隔符前后的子串加入结果的List,那么很显然并没有考虑到一个String中有多个字符串的情况。一种比较容易想到的方法是:
- 先对List中每个字符串遍历;
- 对于每个字符串内部,维护一个缓冲区;
- 遍历一个字符串时,若遇到分隔符,且缓冲区不为空,则将缓冲区内容加入result,并清空缓冲区;若未遇到分隔符,则将当前字符加入缓冲区;
- 遍历完该字符串后,还要检查一边缓冲区,若不为空,将剩余字符串也加入result;
- 对每个字符串重复2-4步的操作即可。
实现代码如下:
class Solution {
public List<String> splitWordsBySeparator(List<String> words, char separator) {
List<String> res = new ArrayList<>();
for(String str:words) {
//相当于为每个单词维护一个临时缓冲区
StringBuilder sb = new StringBuilder();
for(int i=0;i<str.length();i++) {
//若遇到分隔符,且缓冲区不为空
//将缓冲区内容加入res,清空缓冲区
if(str.charAt(i)==separator) {
if(sb.length()>0) {
res.add(sb.toString());
sb.setLength(0);
}
}
//若未遇到分隔符,则当前字符加入缓冲区sb
else {
sb.append(str.charAt(i));//这个append方法是用StringBuilder的关键
}
}
//遍历完成后,若缓冲区还有剩余字符,全部加入res
if(sb.length()>0) {
res.add(sb.toString());
}
}
return res;
}
}