如何解决计算字符串中一个字符行中的出现次数
在Java中,有什么方法可以计算字符串中char的出现次数吗?
例如,给定字符串ABBB99999SHJ99JI
,将输出在字符串中找到9
个char一次:连续5次,两次:连续2次。
我试图找到解决方案,但没有结果。
可以用正则表达式找到它,但是对于每种数量的数字,我需要创建一个单独的数字。
解决方法
可以使用您提到的regexp来完成:
- 创建一个正则表达式以查找包含至少一个字符的组,例如
#include <QtWidgets> QApplication* create_application(int argc,char* argv[]) { return new QApplication(argc,argv); } int main(int argc,char* argv[]) { QApplication* app = create_application(argc,argv); QWidget window; window.show(); app->exec(); }
- 循环查找组并收集它们的长度。
([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'));
更新
可能需要为每个字符建立一个映射到长度列表
将@Andreas提供的所有更改集成到注释中:
[5,2]
对于给定的来源: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"));
注意:使用LinkedHashMap保持插入顺序
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。