Conta le occorrenze di un carattere in una stringa

1. Panoramica

Esistono molti modi per contare il numero di occorrenze di un carattere in una stringa in Java.

In questo rapido articolo, ci concentreremo su alcuni esempi di come contare i caratteri, prima con la libreria Java principale e poi con altre librerie e framework come Spring e Guava.

2. Utilizzo di Core Java Lib

2 .1. Approccio imperativo

Alcuni sviluppatori potrebbero preferire utilizzare Java core. Esistono molti modi per contare il numero di occorrenze di un carattere in una stringa.

Cominciamo con un approccio semplice / ingenuo:

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);

Non sorprende che funzionerà, ma - anche non sorprendentemente - ci sono modi migliori per farlo.

2.2. Utilizzo della ricorsione

Una soluzione meno ovvia, ma comunque interessante, è usare la ricorsione:

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); }

Possiamo invocare questo metodo ricorsivo nel modo seguente: useRecursionToCountChars ("elephant", 'e', ​​0)

2.4. Utilizzo di espressioni regolari

Un altro modo sarebbe usare le espressioni regolari:

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

Nota che questa soluzione è tecnicamente corretta, ma non ottimale, poiché è eccessivo usare le potenti espressioni regolari per risolvere un problema così semplice come trovare il numero di occorrenze di un carattere in una stringa.

2.5. Utilizzo delle funzionalità di Java 8

Le nuove funzionalità disponibili in Java 8 possono essere molto utili qui.

Usiamo flussi e lambda per implementare il conteggio:

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);

Quindi, questa è chiaramente una soluzione più pulita e più leggibile utilizzando la libreria principale.

3. Utilizzo di librerie esterne

Vediamo ora alcune soluzioni che fanno uso di utilità da librerie esterne.

3.1. Utilizzando StringUtils

In generale, è sempre meglio utilizzare una soluzione esistente invece di inventare la nostra. La classe commons.lang.StringUtils ci fornisce il metodo countMatches () , che può essere utilizzato per contare i caratteri o anche le sottostringhe in una determinata stringa .

Innanzitutto, dobbiamo includere la dipendenza appropriata:

 org.apache.commons commons-lang3 3.5 

Possiamo trovare l'ultima versione su Maven Central.

Usiamo ora countMatches () per contare il numero di caratteri 'e' nella stringa letterale "elefante":

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

3.2. Utilizzando Guava

Guava può anche essere utile per contare i caratteri. Dobbiamo definire la dipendenza:

 com.google.guava guava 21.0 

Possiamo trovare l'ultima versione su Maven Central.

Vediamo come Guava può aiutarci rapidamente a contare i caratteri:

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

3.3. Usando la primavera

Naturalmente l'aggiunta di Spring Framework nel tuo progetto solo per contare i caratteri non ha senso. Tuttavia, se lo abbiamo già nel nostro progetto, dobbiamo solo usare il metodo countOccurencesOf () :

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

4. Conclusione

In questo rapido tutorial, ci siamo concentrati su vari modi per contare i caratteri nella stringa. Alcuni di loro sono stati progettati esclusivamente in Java; alcune richiedono librerie aggiuntive.

La nostra raccomandazione è di utilizzare utilità già esistenti da StringUtils , Guava o Spring. Tuttavia, se si preferisce utilizzare solo Java semplice, questo articolo offre alcune possibilità per ottenere risultati ottimali con Java 8.

Il codice sorgente completo per questi esempi è disponibile in questo progetto GitHub.