Überprüfen Sie, ob ein String in Java ein Pangram ist

1. Übersicht

In diesem Tutorial lernen wir mit einem einfachen Java-Programm zu überprüfen, ob eine bestimmte Zeichenfolge ein gültiges Pangram ist oder nicht. Ein Pangram ist eine beliebige Zeichenfolge, die alle Buchstaben eines bestimmten Alphabets enthält, die mindestens einmal festgelegt wurden.

2. Pangrams

Pangrams gelten nicht nur für die englische Sprache, sondern auch für jede andere Sprache mit einem festen Zeichensatz.

Ein allgemein bekanntes englisches Pangram ist beispielsweise „Ein schneller Braunfuchs springt über den faulen Hund“. Ebenso sind diese auch in anderen Sprachen verfügbar.

3. Verwenden einer for- Schleife

Versuchen wir zunächst eine for- Schleife . Wir füllen ein Boolesches Array mit Markierungen für jedes Zeichen des Alphabets.

Der Code gibt true zurück , wenn alle Werte im Marker-Array auf true gesetzt sind :

public static boolean isPangram(String str) { if (str == null) { return false; } Boolean[] alphabetMarker = new 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(i) - 'A'; alphabetMarker[alphabetIndex] = true; } } for (boolean index : alphabetMarker) { if (!index) { return false; } } return true; }

Testen wir unsere Implementierung:

@Test public void givenValidString_isPanagram_shouldReturnSuccess() { String input = "Two driven jocks help fax my big quiz"; assertTrue(Pangram.isPangram(input)); }

4. Verwenden von Java-Streams

Ein alternativer Ansatz umfasst die Verwendung der Java Streams-API. Wir können aus dem angegebenen Eingabetext einen gefilterten Zeichenstrom erstellen und mit dem Stream eine Alphabet- Map erstellen .

Der Code gibt Erfolg zurück, wenn die Größe der Karte der Größe des Alphabets entspricht. Für Englisch beträgt die erwartete Größe 26:

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

Und natürlich testen wir:

@Test public void givenValidString_isPangramWithStreams_shouldReturnSuccess() { String input = "The quick brown fox jumps over the lazy dog"; assertTrue(Pangram.isPangramWithStreams(input)); }

5. Ändern für perfekte Pangrams

Ein perfektes Pangram unterscheidet sich ein wenig von einem normalen Pangram. Ein perfektes Pangram besteht aus jedem Buchstaben des Alphabets genau einmal im Gegensatz zu mindestens einmal für ein Pangram.

Der Code gibt true zurück , wenn sowohl die Kartengröße der Alphabetgröße entspricht als auch die Häufigkeit der einzelnen Zeichen im Alphabet genau eins beträgt:

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

Und testen wir:

@Test public void givenPerfectPangramString_isPerfectPangram_shouldReturnSuccess() { String input = "abcdefghijklmNoPqrStuVwxyz"; assertTrue(Pangram.isPerfectPangram(input)); }

Ein perfekter Pangram sollte jeden Charakter genau einmal haben. Unser vorheriges Pangram sollte also scheitern:

String input = "Two driven jocks help fax my big quiz"; assertFalse(Pangram.isPerfectPangram(input));

Im obigen Code hat die angegebene Zeichenfolgeneingabe mehrere Duplikate, wie z. B. zwei O's. Daher ist die Ausgabe falsch .

5. Schlussfolgerung

In diesem Artikel haben wir verschiedene Lösungsansätze behandelt, um herauszufinden, ob eine bestimmte Zeichenfolge ein gültiges Pangram ist oder nicht.

Wir haben auch eine andere Art von Pangrams besprochen, die als perfektes Pangram bezeichnet wird und wie man sie programmgesteuert identifiziert.

Das Codebeispiel ist auf GitHub verfügbar.