Überprüfen Sie mit Java, ob eine Zeichenfolge alle Buchstaben des Alphabets enthält

1. Übersicht

In diesem Tutorial erfahren Sie, wie Sie überprüfen, ob ein String alle Buchstaben des Alphabets enthält oder nicht.

Hier ein kurzes Beispiel: „ Farmer Jack erkannte, dass große gelbe Quilts teuer waren. ”- die eigentlich alle Buchstaben des Alphabets enthält.

Wir werden drei Ansätze diskutieren.

Zunächst modellieren wir den Algorithmus mit einem imperativen Ansatz. Dann werden reguläre Ausdrücke verwendet. Und schließlich werden wir einen deklarativeren Ansatz mit Java 8 nutzen.

Zusätzlich werden wir die Big-O-Komplexität der gewählten Ansätze diskutieren.

2. Imperativer Algorithmus

Lassen Sie uns einen imperativen Algorithmus implementieren. Dazu erstellen wir zunächst ein besuchtes boolesches Array. Dann gehen wir Zeichen für Zeichen durch die Eingabezeichenfolge und markieren das Zeichen als besucht.

Bitte beachten Sie, dass Groß- und Kleinbuchstaben gleich sind. Der Index 0 repräsentiert also sowohl A als auch a, ebenso repräsentiert der Index 25 sowohl Z als auch z.

Schließlich prüfen wir, ob alle Zeichen im besuchten Array auf true gesetzt sind:

public class EnglishAlphabetLetters { public static boolean checkStringForAllTheLetters(String input) { int index = 0; boolean[] visited = new 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'; } visited[index] = true; } for (int id = 0; id < 26; id++) { if (!visited[id]) { return false; } } return true; } }

Die Big-O-Komplexität dieses Programms ist O (n), wobei n die Länge des Strings ist.

Beachten Sie, dass es viele Möglichkeiten gibt, den Algorithmus zu optimieren, z. B. Buchstaben aus einem Satz zu entfernen und zu brechen, sobald der Satz leer ist. Für die Übung ist dieser Algorithmus jedoch gut genug.

3. Verwenden des regulären Ausdrucks

Mit dem regulären Ausdruck können wir mit ein paar Codezeilen leicht die gleichen Ergebnisse erzielen:

public static boolean checkStringForAllLetterUsingRegex(String input) { return input.toLowerCase() .replaceAll("[^a-z]", "") .replaceAll("(.)(?=.*\\1)", "") .length() == 26; }

Hier werden zunächst alle Zeichen außer den Buchstaben aus der Eingabe entfernt . Dann entfernen wir doppelte Zeichen. Schließlich zählen wir Buchstaben und stellen sicher, dass wir alle haben, 26.

Obwohl weniger performant, tendiert die Big-O-Komplexität dieses Ansatzes auch zu O (n).

4. Java 8 Stream

Mit Java 8-Funktionen können wir das gleiche Ergebnis auf kompaktere und deklarativere Weise erzielen, indem wir den Stream- Filter und verschiedene Methoden verwenden:

public static boolean checkStringForAllLetterUsingStream(String input) { long c = input.toLowerCase().chars() .filter(ch -> ch >= 'a' && ch <= 'z') .distinct() .count(); return c == 26; }

Die Big-O-Komplexität dieses Ansatzes wird auch O (n) sein.

4. Testen

Testen wir einen glücklichen Weg für unseren Algorithmus:

@Test public void givenString_whenContainsAllCharacter_thenTrue() { String sentence = "Farmer jack realized that big yellow quilts were expensive"; assertTrue(EnglishAlphabetLetters.checkStringForAllTheLetters(sentence)); }

Hier enthält der Satz alle Buchstaben des Alphabets, daher erwarten wir als Ergebnis wahr .

5. Schlussfolgerung

In diesem Tutorial haben wir beschrieben, wie Sie überprüfen, ob eine Zeichenfolge alle Buchstaben des Alphabets enthält .

Wir haben einige Möglichkeiten gesehen, dies zuerst mithilfe traditioneller imperativer Programmierung, regulärer Ausdrücke und Java 8-Streams zu implementieren.

Der vollständige Quellcode ist auf GitHub verfügbar.