Controleer of een String een Pangram is in Java

1. Overzicht

In deze tutorial zullen we leren om te controleren of een bepaalde string een geldige pangram is of niet met behulp van een eenvoudig Java-programma. EEN pangram is een string die alle letters van een bepaald alfabet tenminste één keer bevat.

2. Pangrammen

Pangrams zijn niet alleen van toepassing op de Engelse taal, maar ook op elke andere taal met een vaste tekenset.

Een algemeen bekende Engelse pangram is bijvoorbeeld "Een snelle bruine vos springt over de luie hond". Evenzo zijn deze ook in andere talen beschikbaar.

3. Met behulp van een voor Lus

Laten we eerst een voor lus. We vullen een Boolean array met markeringen voor elk teken van het alfabet.

De code keert terug waar wanneer alle waarden in de marker-array zijn ingesteld op waar:

openbare statische boolean isPangram (String str) {if (str == null) {return false; } Boolean [] alphabetMarker = nieuwe Boolean [ALPHABET_COUNT]; Arrays.fill (alphabetMarker, false); int alphabetIndex = 0; str = str.toUpperCase (); for (int i = 0; i <str.length (); i ++) {if ('A' <= str.charAt (i) && str.charAt (i) <= 'Z') {alphabetIndex = str.charAt (IA'; alfabetMarker [alfabetIndex] = waar; }} voor (boolean index: alphabetMarker) {if (! index) {return false; }} retourneren waar; }

Laten we onze implementatie testen:

@Test openbare ongeldig gegevenValidString_isPanagram_shouldReturnSuccess () {String input = "Twee aangedreven jocks helpen bij het faxen van mijn grote quiz"; assertTrue (Pangram.isPangram (input)); }

4. Java Streams gebruiken

Een alternatieve benadering is het gebruik van de Java Streams API. Wij kunnen maak een gefilterde tekenstroom uit de gegeven invoertekst en maak een alfabet Kaart met behulp van de stream.

De code retourneert succes als de grootte van de Kaart is gelijk aan de grootte van het alfabet. Voor Engels is de verwachte maat 26:

openbare statische boolean isPangramWithStreams (String str) {if (str == null) {return false; } String strUpper = str.toUpperCase (); Stream filterCharStream = strUpper.chars () .filter (item -> ((item> = 'A' && item (char) c); Map alphabetMap = filterCharStream.collect (Collectors.toMap (item -> item, k -> Boolean .TRUE, (p1, p2) -> p1)); return alphabetMap.size () == ALPHABET_COUNT;}

En laten we natuurlijk testen:

@Test openbare leegte gegevenValidString_isPangramWithStreams_shouldReturnSuccess () {String input = "De snelle bruine vos springt over de luie hond"; assertTrue (Pangram.isPangramWithStreams (input)); }

5. Aanpassen voor perfecte Pangrams

Een perfecte pangram is een beetje anders dan een gewone pangram. EEN perfecte pangram bestaat uit elke letter van het alfabet precies één keer in tegenstelling tot minstens één keer voor een pangram.

De code keert terug waar wanneer beide Kaart grootte is gelijk aan de grootte van het alfabet en de frequentie van elk teken in het alfabet is precies één:

openbare statische boolean isPerfectPangram (String str) {if (str == null) {return false; } String strUpper = str.toUpperCase (); Stream filterCharStream = strUpper.chars () .filter (item -> ((item> = 'A' && item (char) c); Map alphabetFrequencyMap = filterCharStream.collect (Collectors.groupingBy (Function.identity (), Collectors.counting ())); return alphabetFrequencyMap.size () == ALPHABET_COUNT && alphabetFrequencyMap.values ​​(). stream (). allMatch (item -> item == 1);}

En laten we testen:

@Test openbare ongeldig gegevenPerfectPangramString_isPerfectPangram_shouldReturnSuccess () {String input = "abcdefghijklmNoPqrStuVwxyz"; assertTrue (Pangram.isPerfectPangram (input)); }

Een perfecte pangram zou elk karakter precies één keer moeten bevatten. Dus onze vorige pangram zou moeten mislukken:

String input = "Twee aangedreven jocks helpen bij het faxen van mijn grote quiz"; assertFalse (Pangram.isPerfectPangram (invoer));

In de bovenstaande code heeft de gegeven stringinvoer verschillende duplicaten, alsof het twee o's heeft. Vandaar dat de output is false.

5. Conclusie

In dit artikel hebben we verschillende oplossingsrichtingen besproken om erachter te komen of een bepaalde string een geldige pangram is of niet.

We bespraken ook een andere smaak van pangrams die perfecte pangram wordt genoemd en hoe je deze programmatisch kunt identificeren.

Het codevoorbeeld is beschikbaar op GitHub.