Java >> Java tutorial >  >> Tag >> char

Tjek om et tegn er en vokal i Java

2. Kontrol af vokal ved hjælp af indexOf-metoden

1. Oversigt

Når du behandler tegn fra en streng, vi ønsker måske at klassificere dem efter, om de er i en bestemt gruppe. For eksempel er tegn i det engelske alfabet enten vokaler eller konsonanter.

I denne øvelse vil vi se på nogle få metoder til at kontrollere, om et tegn er en vokal. Vi kunne nemt udvide disse metoder til andre grupper af karakterer.

2. Søger efter vokal ved hjælp af indexOf Metode

Da vi kender alle vokalerne, kunne vi tilføje dem med både store og små bogstaver til en streng :

String VOWELS = "aeiouAEIOU";

Vi kan bruge indexOf metode i strengen klasse for at se, om karakteren er til stede :

boolean isInVowelsString(char c) {
    return VOWELS.indexOf(c) != -1;
}

Hvis tegnet er til stede, vil indekset ikke være -1 . Hvis det er -1 , så er tegnet ikke i sættet af vokaler. Lad os teste dette:

assertThat(isInVowelsString('e')).isTrue();
assertThat(isInVowelsString('z')).isFalse();

Her bruger vi en char i Java. Hvis vores karakter var et enkelt tegn String objekt, kunne vi bruge en anden implementering:

boolean isInVowelsString(String c) {
    return VOWELS.contains(c);
}

Det ville bestå de samme tests:

assertThat(isInVowelsString("e")).isTrue();
assertThat(isInVowelsString("z")).isFalse();

Som vi kan se, er der en lille implementeringsomkostning for denne metode. Vi skal dog iterere gennem 10 mulige vokaler i vokalstrengen for at afgøre, om noget er i gruppen eller ej.

3. Søger efter vokaler ved hjælp af switch

Vi kunne i stedet bruge kontakten udsagn, hvor hver vokal er en separat case :

boolean isVowelBySwitch(char c) {
    switch (c) {
        case 'a':            
        case 'e':           
        case 'i':           
        case 'o':            
        case 'u':            
        case 'A':
        case 'E':            
        case 'I':           
        case 'O':            
        case 'U':
            return true;
        default:
            return false;
    }
}

Vi kan også teste dette:

assertThat(isVowelBySwitch('e')).isTrue();
assertThat(isVowelBySwitch('z')).isFalse();

Da Java understøtter Stringkontakt  sætninger, kunne vi også implementere dette med enkelttegns strenge.

4. Kontrol af vokaler ved hjælp af regulære udtryk

Selvom vi kan implementere vores egne strengmatchningsalgoritmer,Java Regular Expressions-motoren giver os mulighed for effektivt at matche strenge .

Lad os bygge et regulært udtryk for at genkende en vokal:

Pattern VOWELS_PATTERN = Pattern.compile("[aeiou]", Pattern.CASE_INSENSITIVE);

Den [] bruges til at repræsentere en karakterklasse. Vi har kun indsat vokalerne i denne klasse med små bogstaver, da vi kan matche dem på en måde, hvor der ikke er store og små bogstaver.

Lad os implementere vores matchende algoritme for streng objekter med et enkelt tegn i:

boolean isVowelByRegex(String c) {
    return VOWELS_PATTERN.matcher(c).matches();
}

Lad os teste dette:

assertThat(isVowelByRegex("e")).isTrue();
assertThat(isVowelByRegex("E")).isTrue();

Som vi kan se, er det regulære udtryk ufølsomt for store og små bogstaver.

Vi skal bemærke, at dette kræver, at inputtet er en streng ikke en karakter. Selvom vi kan konvertere et tegn til streng ved hjælp af karakteren klasses toString metode :

assertThat(isVowelByRegex(Character.toString('e'))).isTrue();

Brug af regulære udtryk gør det nemt at håndtere det generelle tilfælde af dette problem. Vi kan angive enhver gruppering af tegn ved hjælp af tegnklasser, inklusive tegnintervaller.

5. Hvilken løsning skal vi bruge?

Strengen -baseret løsning er nok den enkleste at forstå og fungerer ret godt, da den kun behøver at kontrollere maksimalt 10 muligheder for hvert tegn, den klassificerer.

Vi forventer dog generelt en switch sætning til at udføre hurtigere end en streng opslag.

Løsningen med regulære udtryk burde fungere meget godt, da regulære udtryk optimeres under kompileringen metode til mønster . Men regulære udtryk kan være mere komplicerede at implementere og er måske ikke kompleksiteten værd for noget så simpelt som at opdage vokaler. På samme måde, hvis vi arbejder med char værdier, så kræver det regulære udtryk en vis konvertering, de andre metoder ikke gør.

Men brug af regulære udtryk giver os mulighed for at implementere sofistikerede udtryk for at klassificere tegn .

6. Konklusion

I denne artikel har vi set et par forskellige måder at identificere, om et tegn er en vokal. Vi så, hvordan en streng med alle vokalerne kunne bruges, og hvordan man implementerede en switch erklæring.

Til sidst så vi, hvordan regulære udtryk kunne bruges til at løse dette og mere generelle tilfælde.

Som altid kan den komplette kode til denne tutorial findes på GitHub.


Java tag