我有字符串
a.b.c.d
我想以惯用的方式计算“.”的出现次数,最好是单行。
(之前我把这个约束表达为“没有循环”,以防你想知道为什么每个人都试图在不使用循环的情况下回答)。
怎么样。它下面不使用正则表达式,所以应该比其他一些解决方案更快,并且不会使用循环。
int count = line.length() - line.replace(".", "").length();
我的“惯用单行词”是:
int count = StringUtils.countMatches("a.b.c.d", ".");
当它已经在公共语言中时,为什么要自己写它?
Spring Framework对此的单行代码是:
int occurance = StringUtils.countOccurrencesOf("a.b.c.d", ".");
总结其他答案以及我所知道的所有方法,使用一行代码:
String testString = "a.b.c.d";
1)使用Apache Commons
int apache = StringUtils.countMatches(testString, ".");
System.out.println("apache = " + apache);
2)使用Spring Framework的
int spring = org.springframework.util.StringUtils.countOccurrencesOf(testString, ".");
System.out.println("spring = " + spring);
3) 使用替换
int replace = testString.length() - testString.replace(".", "").length();
System.out.println("replace = " + replace);
4) 使用替换全部(案例 1)
int replaceAll = testString.replaceAll("[^.]", "").length();
System.out.println("replaceAll = " + replaceAll);
5) 使用替换全部(案例 2)
int replaceAllCase2 = testString.length() - testString.replaceAll("\.", "").length();
System.out.println("replaceAll (second case) = " + replaceAllCase2);
6) 使用拆分
int split = testString.split("\.",-1).length-1;
System.out.println("split = " + split);
7) 使用 Java8(案例 1)
long java8 = testString.chars().filter(ch -> ch =='.').count();
System.out.println("java8 = " + java8);
8)使用Java8(案例2),对于Unicode可能比案例1更好
long java8Case2 = testString.codePoints().filter(ch -> ch =='.').count();
System.out.println("java8 (second case) = " + java8Case2);
9) 使用字符串标记器
int stringTokenizer = new StringTokenizer(" " +testString + " ", ".").countTokens()-1;
System.out.println("stringTokenizer = " + stringTokenizer);
来自评论:小心StringTokenizer,对于a.b.c.d,它会工作,但对于…公元前….d或…a.b.c.d或a.b.c…d…等。它行不通。它只是会算数.字符之间只有一次
更多信息在 github
性能测试(使用 JMH,模式 = 平均时间,得分更好):0.010
0.351
Benchmark Mode Cnt Score Error Units
1. countMatches avgt 5 0.010 ± 0.001 us/op
2. countOccurrencesOf avgt 5 0.010 ± 0.001 us/op
3. stringTokenizer avgt 5 0.028 ± 0.002 us/op
4. java8_1 avgt 5 0.077 ± 0.005 us/op
5. java8_2 avgt 5 0.078 ± 0.003 us/op
6. split avgt 5 0.137 ± 0.009 us/op
7. replaceAll_2 avgt 5 0.302 ± 0.047 us/op
8. replace avgt 5 0.303 ± 0.034 us/op
9. replaceAll_1 avgt 5 0.351 ± 0.045 us/op
模板简介:该模板名称为【 Java 如何计算字符串中字符的出现次数?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。