Controleer of een string alle letters van het alfabet bevat met Java

1. Overzicht

In deze tutorial zullen we zien hoe we kunnen controleren of een String alle letters van het alfabet bevat of niet.

Hier is een kort voorbeeld: "Farmer Jack realiseerde zich dat grote gele dekbedden duur waren.”- die eigenlijk alle letters van het alfabet bevat.

We bespreken drie benaderingen.

Eerst zullen we het algoritme modelleren met behulp van een imperatieve benadering. Gebruik dan reguliere expressies. En tot slot zullen we profiteren van een meer declaratieve benadering met behulp van Java 8.

Daarnaast bespreken we de Big-O-complexiteit van de gekozen benaderingen.

2. Imperatief algoritme

Laten we een imperatief algoritme implementeren. Hiervoor maken we eerst een booleaanse array die wordt bezocht. Vervolgens doorlopen we de invoertekenreeks teken voor teken en markeren we het teken als bezocht.

Houd er rekening mee dat Hoofdletters en Kleine letters worden als hetzelfde beschouwd. Dus index 0 vertegenwoordigt zowel A als a, evenzo vertegenwoordigt index 25 zowel Z als z.

Ten slotte zullen we controleren of alle tekens in de bezochte array zijn ingesteld op true:

openbare klasse EnglishAlphabetLetters {openbare statische boolean checkStringForAllTheLetters (String-invoer) {int index = 0; boolean [] bezocht = nieuwe boolean [26]; for (int id = 0; id <input.length (); id ++) {if ('a' <= input.charAt (id) && input.charAt (id) <= 'z') {index = input.charAt (id) - 'a'; } else if ('A' <= input.charAt (id) && input.charAt (id) <= 'Z') {index = input.charAt (id) - 'A'; } bezocht [index] = waar; } for (int id = 0; id <26; id ++) {if (! bezocht [id]) {return false; }} retourneren waar; }}

Big-O-complexiteit van dit programma is O (n) waar n is de lengte van de string.

Merk op dat er veel manieren zijn om het algoritme te optimaliseren, zoals het verwijderen van letters uit een set en breken zodra het Set is leeg. Voor het doel van de oefening is dit algoritme echter goed genoeg.

3. Reguliere expressie gebruiken

Met behulp van reguliere expressies kunnen we gemakkelijk dezelfde resultaten krijgen met een paar regels code:

openbare statische boolean checkStringForAllLetterUsingRegex (String-invoer) {return input.toLowerCase () .replaceAll ("[^ az]", "") .replaceAll ("(.) (? =. * \ 1)", ""). lengte () == 26; }

Hier verwijderen we eerst alle tekens behalve alfabetletters uit de invoer. Vervolgens verwijderen we dubbele tekens. Ten slotte tellen we letters en zorgen we ervoor dat we ze allemaal hebben, 26.

Hoewel minder performant, neigt Big-O-Complexity van deze benadering ook naar O (n).

4. Java 8-stream

Met behulp van Java 8-functies kunnen we eenvoudig hetzelfde resultaat bereiken op een meer compacte en declaratieve manier met Stream's filter en onderscheiden methoden:

openbare statische boolean checkStringForAllLetterUsingStream (String-invoer) {long c = input.toLowerCase (). chars () .filter (ch -> ch> = 'a' && ch <= 'z') .distinct () .count (); retourneer c == 26; }

De Big-O-complexiteit van deze benadering zal ook O (n) zijn.

4. Testen

Laten we een gelukkig pad testen voor ons algoritme:

@Test openbare leegte gegevenString_whenContainsAllCharacter_thenTrue () {String zin = "Boer Jack realiseerde zich dat grote gele quilts duur waren"; assertTrue (EnglishAlphabetLetters.checkStringForAllTheLetters (zin)); }

Hier, zin bevat alle letters van het alfabet, dus we verwachten waar als resultaat.

5. Conclusie

In deze zelfstudie hebben we besproken hoe u kunt controleren of een tekenreeks alle letters van het alfabet bevat.

We hebben een aantal manieren gezien om dit eerst te implementeren met behulp van traditionele imperatieve programmering, reguliere expressies en Java 8-streams.

De volledige broncode is beschikbaar op GitHub.