可以使用你提到的正则表达式来完成:
- 创建一个正则表达式来查找包含至少一个字符的组,例如
([9]+)
- 循环查找组并收集它们的长度。
public static List<Integer> countGroupLengths(String src, char c) {
Pattern p = Pattern.compile(c + "+"); // e.g. `9+` works too
Matcher m = p.matcher(src);
List<Integer> result = new ArrayList<>();
while (m.find()) {
String group = m.group(1);
result.add(group.length());
}
return result;
}
测试:
System.out.println(countGroupLengths("ABBB99999SHJ99JI", '9'));
输出:
[5, 2]
更新
为每个字符构建到长度列表的映射可能是值得的
在 cmets 中集成 @Andreas 提供的所有更改:
public static Map<Character, List<Integer>> buildMapOfGroups(String src) {
return src.chars() // IntStream
.mapToObj(c -> (char) c)
.map(c -> Map.entry(
c, // key
Pattern.compile(c + "+").matcher(src)
.results()
.map(r -> r.group().length())
.collect(Collectors.toList())
))
.collect(Collectors.toMap(
Map.Entry::getKey, Map.Entry::getValue,
(e1, e2) -> e1, LinkedHashMap::new));
}
对于给定的来源:System.out.println(buildMapOfGroups("ABBB99999SHJ99JI"));
打印:
{A=[1], B=[3], 9=[5, 2], S=[1], H=[1], J=[1, 1], I=[1]}
注意:使用 LinkedHashMap 保持插入顺序