Java >> Java tutorial >  >> Tag >> String

Tæl mellemrum i en Java-streng

1. Oversigt

Når vi arbejder med Java-strenge, vil vi nogle gange gerne tælle, hvor mange mellemrum der er i en streng.

Der er forskellige måder at få resultatet på. I denne hurtige selvstudie vil vi se, hvordan du får det gjort gennem eksempler.

2. Eksempelinputstrengen

Først og fremmest, lad os forberede en inputstreng som eksemplet:

String INPUT_STRING = "  This string has nine spaces and a Tab:'	'";

Strengen ovenfor indeholder ni mellemrum og et tabulatortegn ombrudt af enkelte anførselstegn. Vores mål er kun at tælle mellemrumstegn i den givne inputstreng .

Derfor er vores forventede resultat:

int EXPECTED_COUNT = 9;

Lad os derefter udforske forskellige løsninger for at få det rigtige resultat.

Vi løser først problemet ved hjælp af Java-standardbiblioteket, derefter løser vi det ved hjælp af nogle populære eksterne biblioteker.

Til sidst, i denne vejledning, vil vi behandle alle løsninger i enhedstestmetoder.

3. Brug af Java Standard Library

3.1. Den klassiske løsning:Looping og tælling

Dette er nok den mest ligetil ide til at løse problemet.

Vi gennemgår alle tegnene i inputstrengen. Vi bevarer også en tællervariabel og øger tælleren, når vi ser et mellemrumstegn.

Til sidst får vi antallet af mellemrum i strengen:

@Test
void givenString_whenCountSpaceByLooping_thenReturnsExpectedCount() {
    int spaceCount = 0;
    for (char c : INPUT_STRING.toCharArray()) {
        if (c == ' ') {
            spaceCount++;
        }
    }
    assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}

3.2. Brug af Java 8's Stream API

Stream API har eksisteret siden Java 8.

Derudover siden Java 9, et nyt chars() metode er blevet tilføjet til strengen klasse for at konvertere char værdier fra strengen ind i en IntStream forekomst .

Hvis vi arbejder med Java 9 eller nyere, kan vi kombinere de to funktioner for at løse problemet i en one-liner:

@Test
void givenString_whenCountSpaceByJava8StreamFilter_thenReturnsExpectedCount() {
    long spaceCount = INPUT_STRING.chars().filter(c -> c == (int) ' ').count();
    assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}

3.3. Brug af Regex's Matcher.find() Metode

Indtil videre har vi set løsninger, der tæller ved at søge på mellemrumstegnene i den givne streng. Vi har brugt character ==‘ ‘  for at kontrollere, om et tegn er et mellemrumstegn.

Regular Expression (Regex) er et andet kraftfuldt våben til at søge efter strenge, og Java har god understøttelse af Regex.

Derfor kan vi definere et enkelt mellemrum som et mønster og bruge Matcher.find() metode til at kontrollere, om mønsteret findes i inputstrengen.

For at få antallet af mellemrum øger vi også en tæller, hver gang mønsteret er fundet:

@Test
void givenString_whenCountSpaceByRegexMatcher_thenReturnsExpectedCount() {
    Pattern pattern = Pattern.compile(" ");
    Matcher matcher = pattern.matcher(INPUT_STRING);
    int spaceCount = 0;
    while (matcher.find()) {
        spaceCount++;
    }
    assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}

3.4. Brug af String.replaceAll() Metode

Brug af Matcher.find() metode til at søge og finde rum er ret ligetil. Men da vi taler om Regex, kan der være andre hurtige måder at tælle mellemrum på.

Vi ved, at vi kan "søge og erstatte" ved at bruge String.replaceAll() metode.

Derfor,hvis vi erstatter alle ikke-mellemrumstegn i inputstrengen med en tom streng, vil alle mellemrum fra inputtet være resultatet .

Så hvis vi ønsker at få optællingen, vil længden af ​​den resulterende streng være svaret. Lad os derefter prøve denne idé:

@Test
void givenString_whenCountSpaceByReplaceAll_thenReturnsExpectedCount() {
    int spaceCount = INPUT_STRING.replaceAll("[^ ]", "").length();
    assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}

Som koden ovenfor viser, har vi kun én linje til at få optællingen.

Det er værd at nævne, at i String.replaceAll() kalder, har vi brugt mønsteret “[^ ]” i stedet for “\\S”. Dette skyldes, at vi gerne vil erstatte tegn uden mellemrum i stedet for kun tegn uden mellemrum.

3.5. Brug af String.split() Metode

Vi har set, at løsningen med String.replaceAll() metoden er pæn og kompakt. Lad os nu se en anden idé til at løse problemet:ved at bruge String.split() metode.

Som vi ved, kan vi sende et mønster til String.split() metode og få en række strenge, der splittes af mønsteret.

Så ideen er, vi kan opdele inputstrengen med et enkelt mellemrum. Derefter vil antallet af mellemrum i den originale streng være én mindre end strengmatrixens længde .

Lad os nu se, om denne idé virker:

@Test
void givenString_whenCountSpaceBySplit_thenReturnsExpectedCount() {
    int spaceCount = INPUT_STRING.split(" ").length - 1;
    assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}

4. Brug af eksterne biblioteker

Apache Commons Lang 3-biblioteket er meget udbredt i Java-projekter. Foråret er også en populær ramme blandt Java-entusiaster.

Begge biblioteker har leveret en praktisk streng-hjælpeklasse.

Lad os nu se, hvordan man tæller mellemrum i en inputstreng ved hjælp af disse biblioteker.

4.1. Brug af Apache Commons Lang 3-biblioteket

Apache Commons Lang 3-biblioteket har leveret en StringUtil klasse, der indeholder mange praktiske streng-relaterede metoder.

For at tælle mellemrummene i en streng kan vi bruge countMatches() metode i denne klasse.

Før vi begynder at bruge StringUtil klasse, bør vi tjekke, om biblioteket er i klassestien. Vi kan tilføje afhængigheden med den seneste version i vores pom.xml :

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

Lad os nu lave en enhedstest for at vise, hvordan man bruger denne metode:

@Test
void givenString_whenCountSpaceUsingApacheCommons_thenReturnsExpectedCount() {
    int spaceCount = StringUtils.countMatches(INPUT_STRING, " ");
    assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}

4.2. Brug af Spring

I dag er mange Java-projekter baseret på Spring frameworket. Så hvis vi arbejder med Spring, er et fint strengværktøj leveret af Spring allerede klar til brug:StringUtils .

Ja, den har samme navn som klassen i Apache Commons Lang 3. Desuden giver den en countOccurrencesOf() metode til at tælle forekomsten af ​​et tegn i en streng.

Det er præcis, hvad vi leder efter:

@Test
void givenString_whenCountSpaceUsingSpring_thenReturnsExpectedCount() {
    int spaceCount = StringUtils.countOccurrencesOf(INPUT_STRING, " ");
    assertThat(spaceCount).isEqualTo(EXPECTED_COUNT);
}

5. Konklusion

I denne artikel har vi behandlet forskellige tilgange til at tælle mellemrumstegn i en inputstreng.

Som altid kan koden til artiklen findes på GitHub.


Java tag