Tæl forekomster af en char i en streng

1. Oversigt

Der er mange måder at tælle antallet af forekomster af en rød i en Snor i Java.

I denne hurtige artikel vil vi fokusere på et par eksempler på, hvordan man tæller tegn, først med det centrale Java-bibliotek og derefter med andre biblioteker og rammer som Spring og Guava.

2. Brug af Core Java Lib

2.1. Imperativ tilgang

Nogle udviklere foretrækker muligvis at bruge core Java. Der er mange måder at tælle antallet af forekomster af en char i en streng.

Lad os starte med en enkel / naiv tilgang:

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

Ikke overraskende vil dette fungere, men - heller ikke overraskende - der er bedre måder at gøre dette på.

2.2. Brug af rekursion

En mindre indlysende, men stadig interessant løsning er at bruge rekursion:

private static int countOccurences (String someString, char søgteChar, int index) {if (index> = someString.length ()) {return 0; } int count = someString.charAt (index) == søgteChar? 1: 0; returantal + countOccurences (nogleString, søgteChar, indeks + 1); }

Vi kan påberåbe sig denne rekursive metode på følgende måde: useRecursionToCountChars (“elefant”, ‘e’, 0)

2.4. Brug af regulære udtryk

En anden måde ville være at bruge regulære udtryk:

Mønstermønster = Mønster.kompil ("[^ e] * e"); Matcher matcher = mønster.matcher ("elefant"); int-antal = 0; mens (matcher.find ()) {count ++; } assertEquals (2, count);

Bare bemærk, at denne løsning er teknisk korrekt, men suboptimal, da det er overdreven at bruge de meget kraftige regulære udtryk til at løse et så simpelt problem som at finde antallet af forekomster af en karakter i en streng.

2.5. Brug af Java 8-funktioner

Nye funktioner tilgængelige i Java 8 kan være meget nyttige her.

Lad os bruge streams og lambdas til at gennemføre optællingen:

String someString = "elefant"; lang optælling = someString.chars (). filter (ch -> ch == 'e'). count (); assertEquals (2, count); lang count2 = someString.codePoints (). filter (ch -> ch == 'e'). count (); assertEquals (2, count2);

Så dette er helt klart en renere og mere læselig løsning ved hjælp af kernebiblioteket.

3. Brug af eksterne biblioteker

Lad os nu se på et par løsninger, der bruger værktøjer fra eksterne biblioteker.

3.1. Ved brug af StringUtils

Generelt er det altid bedre at bruge en eksisterende løsning i stedet for at opfinde vores egen. Det commons.lang.StringUtils klasse giver os den countMatches () metode, som kan bruges til at tælle tegn eller endda understrenge i en given Snor.

Først skal vi inkludere den relevante afhængighed:

 org.apache.commons commons-lang3 3.5 

Vi kan finde den nyeste version på Maven Central.

Lad os nu bruge countMatches () at tælle antallet af 'e' tegn i "elefanten" String bogstaveligt:

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

3.2. Brug af Guava

Guava kan også være nyttigt ved optælling af tegn. Vi er nødt til at definere afhængigheden:

 com.google.guava guava 21.0 

Vi kan finde den nyeste version på Maven Central.

Lad os se, hvordan Guava hurtigt kan hjælpe os med at tælle tegn:

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

3.3. Brug af foråret

Det er naturligvis ikke fornuftigt at tilføje Spring Framework til dit projekt bare for at tælle tegn. Men hvis vi allerede har det i vores projekt, skal vi bare bruge countOccurencesOf () metode:

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

4. Konklusion

I denne hurtige vejledning fokuserede vi på forskellige måder at tælle tegn i strengen på. Nogle af dem blev designet udelukkende i Java; nogle krævede yderligere biblioteker.

Vores anbefaling er at bruge allerede eksisterende værktøjer fra StringUtils, Guava eller forår. Men hvis man foretrækker kun at bruge almindelig Java, tilbyder denne artikel nogle muligheder for at opnå netop det godt med Java 8.

Den komplette kildekode til disse eksempler er tilgængelig i dette GitHub-projekt.