Räkna förekomsten av en röding i en sträng

1. Översikt

Det finns många sätt att räkna antalet förekomster av en röd i en sträng i Java.

I den här snabba artikeln fokuserar vi på några exempel på hur man räknar tecken, först med Java-biblioteket och sedan med andra bibliotek och ramar som Spring och Guava.

2. Använda Core Java Lib

2 .1. Imperativ strategi

Vissa utvecklare kanske föredrar att använda Java-kärnan. Det finns många sätt att räkna antalet förekomster av en röding i en sträng.

Låt oss börja med ett enkelt / naivt tillvägagångssätt:

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

Inte överraskande kommer detta att fungera, men - inte heller överraskande - det finns bättre sätt att göra detta.

2.2. Använda rekursion

En mindre uppenbar, men ändå intressant lösning är att använda rekursion:

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

Vi kan åberopa denna rekursiva metod på följande sätt: useRecursionToCountChars (“elephant”, 'e', ​​0)

2.4. Använda reguljära uttryck

Ett annat sätt skulle vara att använda reguljära uttryck:

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

Observera att den här lösningen är tekniskt korrekt men suboptimal, eftersom det är överdrivet att använda de mycket kraftfulla reguljära uttrycken för att lösa ett så enkelt problem som att hitta antalet förekomster av en karaktär i en sträng.

2.5. Använda Java 8-funktioner

Nya funktioner tillgängliga i Java 8 kan vara till stor hjälp här.

Låt oss använda strömmar och lambdas för att genomföra räkningen:

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

Så detta är helt klart en renare och mer läsbar lösning med hjälp av kärnbiblioteket.

3. Använda externa bibliotek

Låt oss nu titta på några lösningar som använder verktyg från externa bibliotek.

3.1. Använda StringUtils

I allmänhet är det alltid bättre att använda en befintlig lösning istället för att uppfinna vår egen. Den commons.lang.StringUtils klassen ger oss de countMatches () metod, som kan användas för att räkna tecken eller ens understrängar i given sträng .

Först måste vi inkludera lämpligt beroende:

 org.apache.commons commons-lang3 3.5 

Vi hittar den senaste versionen på Maven Central.

Låt oss nu använda countMatches () för att räkna antalet "e" -tecken i "elefanten" String bokstavligt:

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

3.2. Använda Guava

Guava kan också vara till hjälp för att räkna tecken. Vi måste definiera beroendet:

 com.google.guava guava 21.0 

Vi hittar den senaste versionen på Maven Central.

Låt oss se hur Guava snabbt kan hjälpa oss att räkna tecken:

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

3.3. Använda våren

Att lägga till vårramen i ditt projekt bara för att räkna tecken är naturligtvis inte meningsfullt. Men om vi redan har det i vårt projekt behöver vi bara använda metoden countOccurencesOf () :

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

4. Slutsats

I denna snabba handledning fokuserade vi på olika sätt att räkna tecken i strängen. Några av dem designades enbart i Java; vissa krävde ytterligare bibliotek.

Vår rekommendation är att använda redan befintliga verktyg från StringUtils , Guava eller Spring. Men om man föredrar att bara använda vanlig Java, erbjuder den här artikeln några möjligheter att åstadkomma just det bra med Java 8.

Den fullständiga källkoden för dessa exempel finns i detta GitHub-projekt.