Telle Forekomster av en røye i en streng

1. Oversikt

Det er mange måter å telle antall forekomster av en røye i String i Java.

I denne raske artikkelen vil vi fokusere på noen få eksempler på hvordan du teller tegn, først med kjernen i Java-biblioteket og deretter med andre biblioteker og rammer som Spring og Guava.

2. Bruke Core Java Lib

2.1. Imperativ tilnærming

Noen utviklere foretrekker kanskje å bruke core Java. Det er mange måter å telle antall forekomster av en røye i en streng.

La oss starte med en enkel / naiv tilnærming:

String someString = "elefant"; char someChar = 'e'; int-antall = 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 - det er bedre måter å gjøre dette på.

2.2. Bruke rekursjon

En mindre åpenbar, men likevel interessant løsning er å bruke rekursjon:

private static int countOccurences (String someString, charSearchChar, int index) {if (index> = someString.length ()) {return 0; } int count = someString.charAt (index) == søkteChar? 1: 0; returantall + countOccurences (noenString, søkteChar, indeks + 1); }

Vi kan påkalle denne rekursive metoden på følgende måte: useRecursionToCountChars (“elefant”, ‘e’, 0)

2.4. Bruke vanlige uttrykk

En annen måte ville være å bruke vanlige uttrykk:

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

Bare vær oppmerksom på at denne løsningen er teknisk riktig, men suboptimal, da det er for mye å bruke de veldig kraftige regulære uttrykkene for å løse et så enkelt problem som å finne antall forekomster av et tegn i en streng.

2.5. Bruke Java 8-funksjoner

Nye funksjoner tilgjengelig i Java 8 kan være veldig nyttige her.

La oss bruke bekker og lambdas for å implementere tellingen:

String someString = "elefant"; lang telling = 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 mer lesbar løsning ved hjelp av kjernebiblioteket.

3. Bruke eksterne biblioteker

La oss nå se på noen få løsninger som bruker verktøy fra eksterne biblioteker.

3.1. Ved hjelp av StringUtils

Generelt er det alltid bedre å bruke en eksisterende løsning i stedet for å finne på vår egen. De commons.lang.StringUtils klassen gir oss countMatches () metode, som kan brukes til å telle tegn eller til og med understrenger i gitt String.

Først må vi inkludere riktig avhengighet:

 org.apache.commons commons-lang3 3.5 

Vi finner den nyeste versjonen på Maven Central.

La oss nå bruke countMatches () å telle antall ‘e’ tegn i “elefanten” String bokstavelig:

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

3.2. Bruke Guava

Guava kan også være nyttig for å telle tegn. Vi må definere avhengighet:

 com.google.guava guava 21.0 

Vi finner den nyeste versjonen på Maven Central.

La oss se hvordan Guava raskt kan hjelpe oss med å telle tegn:

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

3.3. Bruke våren

Det er naturlig å ikke legge til Spring Framework i prosjektet bare for å telle tegn. Imidlertid, hvis vi allerede har det i prosjektet vårt, trenger vi bare å bruke countOccurencesOf () metode:

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

4. Konklusjon

I denne raske opplæringen fokuserte vi på forskjellige måter å telle tegn i strengen på. Noen av dem ble designet utelukkende på Java; noen krevde ekstra biblioteker.

Vår anbefaling er å bruke allerede eksisterende verktøy fra StringUtils, Guava eller vår. Imidlertid, hvis man foretrekker å bare bruke vanlig Java, tilbyr denne artikkelen noen muligheter for å oppnå akkurat det bra med Java 8.

Den komplette kildekoden for disse eksemplene er tilgjengelig i dette GitHub-prosjektet.


$config[zx-auto] not found$config[zx-overlay] not found