Numărați aparițiile unui Char într-un șir

1. Prezentare generală

Există multe modalități de a număra numărul aparițiilor unui caracter într-un șir în Java.

În acest articol rapid, ne vom concentra pe câteva exemple de cum să numărăm caracterele, mai întâi, cu biblioteca Java de bază și apoi cu alte biblioteci și cadre precum Spring și Guava.

2. Utilizarea Core Java Lib

2 .1. Abordare imperativă

Unii dezvoltatori pot prefera să utilizeze Java de bază. Există multe modalități de numărare a numărului de apariții ale unui caracter într-un șir.

Să începem cu o abordare simplă / naivă:

String someString = "elephant"; char someChar = 'e'; int count = 0; for (int i = 0; i < someString.length(); i++) { if (someString.charAt(i) == someChar) { count++; } } assertEquals(2, count);

Nu este surprinzător că acest lucru va funcționa, dar - și nu este surprinzător - există modalități mai bune de a face acest lucru.

2.2. Utilizarea recursiunii

O soluție mai puțin evidentă, dar totuși interesantă, este utilizarea recursivității:

private static int countOccurences( String someString, char searchedChar, int index) { if (index >= someString.length()) { return 0; } int count = someString.charAt(index) == searchedChar ? 1 : 0; return count + countOccurences( someString, searchedChar, index + 1); }

Putem invoca această metodă recursivă în felul următor: useRecursionToCountChars („elefant”, „e”, 0)

2.4. Utilizarea expresiilor regulate

O altă modalitate ar fi utilizarea expresiilor regulate:

Pattern pattern = Pattern.compile("[^e]*e"); Matcher matcher = pattern.matcher("elephant"); int count = 0; while (matcher.find()) { count++; } assertEquals(2, count);

Rețineți că această soluție este corectă din punct de vedere tehnic, dar sub-optimă, deoarece este exagerat să folosiți expresiile regulate foarte puternice pentru a rezolva o problemă atât de simplă precum găsirea numărului de apariții ale unui caracter într-un șir.

2.5. Utilizarea caracteristicilor Java 8

Funcțiile noi disponibile în Java 8 pot fi foarte utile aici.

Să folosim fluxuri și lambdas pentru a implementa numărul:

String someString = "elephant"; long count = someString.chars().filter(ch -> ch == 'e').count(); assertEquals(2, count); long count2 = someString.codePoints().filter(ch -> ch == 'e').count(); assertEquals(2, count2);

Deci, aceasta este în mod clar o soluție mai curată și mai ușor de citit folosind biblioteca de bază.

3. Utilizarea bibliotecilor externe

Să vedem acum câteva soluții care fac uz de utilități din biblioteci externe.

3.1. Folosind StringUtils

În general, este întotdeauna mai bine să folosești o soluție existentă în loc să o inventăm pe a noastră. Commons.lang.StringUtils Clasa ne oferă () countMatches metodă, care pot fi folosite pentru chars de numărare sau sub-siruri chiar în dat String .

În primul rând, trebuie să includem dependența adecvată:

 org.apache.commons commons-lang3 3.5 

Putem găsi cea mai recentă versiune pe Maven Central.

Să folosim acum countMatches () pentru a număra numărul de caractere „e” în literalul șirului „elefant”:

int count = StringUtils.countMatches("elephant", "e"); assertEquals(2, count);

3.2. Folosind guava

Guava poate fi, de asemenea, utilă în numărarea caracterelor. Trebuie să definim dependența:

 com.google.guava guava 21.0 

Putem găsi cea mai recentă versiune pe Maven Central.

Să vedem cum Guava ne poate ajuta rapid să numărăm litere:

int count = CharMatcher.is('e').countIn("elephant"); assertEquals(2, count);

3.3. Folosind primăvara

Adăugarea naturală a cadrului de primăvară în proiectul dvs. doar pentru a număra caracterele nu are sens. Cu toate acestea, dacă îl avem deja în proiectul nostru, trebuie doar să folosim metoda countOccurencesOf () :

int count = StringUtils.countOccurrencesOf("elephant", "e"); assertEquals(2, count);

4. Concluzie

În acest tutorial rapid, ne-am concentrat pe diverse moduri de a număra caractere în șir. Unele dintre ele au fost concepute pur în Java; unele au nevoie de biblioteci suplimentare.

Recomandarea noastră este să folosiți utilitare deja existente din StringUtils , Guava sau Spring. Cu toate acestea, dacă cineva preferă să utilizeze numai Java simplu, acest articol oferă câteva posibilități de a realiza exact atât de bine cu Java 8.

Codul sursă complet pentru aceste exemple este disponibil în acest proiect GitHub.