Tóm tắt câu trả lời khác và những gì tôi biết tất cả các cách để làm điều này bằng cách sử dụng một lớp lót:
String testString = "a.b.c.d";
1) Sử dụng Apache Commons
int apache = StringUtils.countMatches(testString, ".");
System.out.println("apache = " + apache);
2) Sử dụng Spring Framework's
int spring = org.springframework.util.StringUtils.countOccurrencesOf(testString, ".");
System.out.println("spring = " + spring);
3) Sử dụng thay thế
int replace = testString.length() - testString.replace(".", "").length();
System.out.println("replace = " + replace);
4) Sử dụng thay thế All (trường hợp 1)
int replaceAll = testString.replaceAll("[^.]", "").length();
System.out.println("replaceAll = " + replaceAll);
5) Sử dụng thay thế All (trường hợp 2)
int replaceAllCase2 = testString.length() - testString.replaceAll("\\.", "").length();
System.out.println("replaceAll (second case) = " + replaceAllCase2);
6) Sử dụng chia
int split = testString.split("\\.",-1).length-1;
System.out.println("split = " + split);
7) Sử dụng Java8 (trường hợp 1)
long java8 = testString.chars().filter(ch -> ch =='.').count();
System.out.println("java8 = " + java8);
8) Sử dụng Java8 (trường hợp 2), có thể tốt hơn cho unicode so với trường hợp 1
long java8Case2 = testString.codePoints().filter(ch -> ch =='.').count();
System.out.println("java8 (second case) = " + java8Case2);
9) Sử dụng StringTokenizer
int stringTokenizer = new StringTokenizer(" " +testString + " ", ".").countTokens()-1;
System.out.println("stringTokenizer = " + stringTokenizer);
Từ nhận xét : Hãy cẩn thận với StringTokenizer, đối với abcd, nó sẽ hoạt động nhưng đối với ... bc ... d hoặc ... abcd hoặc a .... b ...... c ..... d ... Hoặc vv nó sẽ không hoạt động. Nó sẽ được tính cho. giữa các nhân vật chỉ một lần
Thêm thông tin trong github
Kiểm tra độ hoàn hảo (sử dụng JMH , mode = AverageTime, 0.010
sau đó đạt điểm cao hơn 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