Sjekk om en streng inneholder alle bokstavene i alfabetet med Java

1. Oversikt

I denne opplæringen vil vi se hvordan du sjekker om en streng inneholder alle bokstavene i alfabetet eller ikke.

Her er et raskt eksempel: “Bondejakke skjønte at store gule dyner var dyre.”- som faktisk inneholder alle bokstavene i alfabetet.

Vi vil diskutere tre tilnærminger.

Først skal vi modellere algoritmen ved å bruke en tvingende tilnærming. Da vil bruke vanlige uttrykk. Og til slutt vil vi dra nytte av en mer deklarativ tilnærming ved bruk av Java 8.

I tillegg vil vi diskutere Big-O-kompleksiteten til tilnærmingene.

2. Imperativ algoritme

La oss implementere en tvingende algoritme. For det første oppretter vi et besøkt boolsk utvalg. Deretter går vi gjennom inngangsstreng karakter for karakter og merker tegnet som besøkt.

Vær oppmerksom på at Stor bokstav og Små bokstaver regnes som det samme. Så indeks 0 representerer både A og a, på samme måte representerer indeks 25 både Z og z.

Til slutt vil vi sjekke om alle tegnene i den besøkte matrisen er satt til sant:

public class EnglishAlphabetLetters {public static boolean checkStringForAllTheLetters (String input) {int index = 0; boolsk [] besøkt = ny boolsk [26]; for (int id = 0; id <input.length (); id ++) {if ('a' <= input.charAt (id) && input.charAt (id) <= 'z') {index = input.charAt (id) - 'a'; } annet hvis ('A' <= input.charAt (id) && input.charAt (id) <= 'Z') {index = input.charAt (id) - 'A'; } besøkt [index] = true; } for (int id = 0; id <26; id ++) {hvis (! besøkt [id]) {return false; }} returner sant; }}

Big-O-kompleksiteten til dette programmet er O (n) hvor n er lengden på strengen.

Merk at det er mange måter å optimalisere algoritmen på, for eksempel å fjerne bokstaver fra et sett og bryte så snart som Sett er tom. For formålet med øvelsen er denne algoritmen god nok.

3. Bruke vanlig uttrykk

Ved å bruke regulært uttrykk kan vi enkelt få de samme resultatene med noen få kodelinjer:

offentlig statisk boolsk sjekkStringForAllLetterUsingRegex (strenginngang) {return input.toLowerCase () .replaceAll ("[^ az]", "") .replaceAll ("(.) (? =. * \ 1)", ""). lengde () == 26; }

Her fjerner vi først alle tegn unntatt alfabetbokstaver fra inngang. Så fjerner vi duplikattegn. Til slutt teller vi bokstaver og sørger for at vi har dem alle, 26.

Selv om det er mindre performant, har Big-O-Complexity av denne tilnærmingen også en tendens til O (n).

4. Java 8 Stream

Ved hjelp av Java 8-funksjoner kan vi enkelt oppnå det samme resultatet på en mer kompakt og deklarativ måte ved hjelp av Streams filter og distinkt metoder:

offentlig statisk boolsk checkStringForAllLetterUsingStream (strenginngang) {long c = input.toLowerCase (). chars () .filter (ch -> ch> = 'a' && ch <= 'z') .distinct () .count (); retur c == 26; }

Stor-O-kompleksitet av denne tilnærmingen vil også være O (n).

4. Testing

La oss teste en lykkelig vei for algoritmen vår:

@Test public void givenString_whenContainsAllCharacter_thenTrue () {String setning = "Farmer jack skjønte at store gule dyner var dyre"; assertTrue (EnglishAlphabetLetters.checkStringForAllTheLetters (setning)); }

Her, setning inneholder alle bokstavene i alfabetet, derfor forventer vi ekte som et resultat.

5. Konklusjon

I denne opplæringen har vi dekket hvordan du sjekker om en streng inneholder alle bokstavene i alfabetet.

Vi så et par måter å implementere dette på først ved hjelp av tradisjonell tvingende programmering, regulære uttrykk og Java 8-strømmer.

Den komplette kildekoden er tilgjengelig på GitHub.