文字列にアルファベットのすべての文字が含まれているかどうかを確認します
1. 概要
このチュートリアルでは、文字列にアルファベットのすべての文字が含まれているかどうかを確認する方法を説明します。
簡単な例を次に示します。「Farmer jack realized that big yellow quilts were expensive.」–実際にはアルファベットのすべての文字が含まれています。
3つのアプローチについて説明します。
まず、命令型アプローチを使用してアルゴリズムをモデル化します。 次に、正規表現を使用します。 そして最後に、Java8を使用したより宣言的なアプローチを利用します。
さらに、採用されたアプローチのBig-O-complexityについても説明します。
2. 命令型アルゴリズム
命令型アルゴリズムを実装しましょう。 このために、最初に、訪問したブール配列を作成します。 次に、入力文字列を1文字ずつ見ていき、その文字に訪問済みのマークを付けます。
UppercaseとLowercaseは同じと見なされることに注意してください。 したがって、インデックス0はAとaの両方を表し、同様にインデックス25はZとzの両方を表します。
最後に、訪問した配列のすべての文字がtrueに設定されているかどうかを確認します。
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;
}
}
このプログラムのBig-O-complexityはO(n)です。ここで、nは文字列の長さです。
セットから文字を削除したり、Setが空になるとすぐに中断したりするなど、アルゴリズムを最適化する方法はたくさんあることに注意してください。 ただし、演習では、このアルゴリズムで十分です。
3. 正規表現を使用する
正規表現を使用すると、数行のコードで同じ結果を簡単に取得できます。
public static boolean checkStringForAllLetterUsingRegex(String input) {
return input.toLowerCase()
.replaceAll("[^a-z]", "")
.replaceAll("(.)(?=.*\\1)", "")
.length() == 26;
}
ここでは、最初にinputからアルファベットを除くすべての文字を削除しています。 次に、重複する文字を削除します。 最後に、私たちは文字を数え、それらがすべて揃っていることを確認しています、26。
パフォーマンスは低下しますが、このアプローチのBig-O-ComplexityもO(n)になる傾向があります。
4. Java 8ストリーム
Java 8の機能を使用すると、Streamのfilter メソッドとdistinctメソッドを使用して、よりコンパクトで宣言的な方法で同じ結果を簡単に実現できます。
public static boolean checkStringForAllLetterUsingStream(String input) {
long c = input.toLowerCase().chars()
.filter(ch -> ch >= 'a' && ch <= 'z')
.distinct()
.count();
return c == 26;
}
このアプローチの大きなO複雑さもO(n)です。
4. テスト
アルゴリズムのハッピーパスをテストしてみましょう。
@Test
public void givenString_whenContainsAllCharacter_thenTrue() {
String sentence = "Farmer jack realized that big yellow quilts were expensive";
assertTrue(EnglishAlphabetLetters.checkStringForAllTheLetters(sentence));
}
ここで、sentenceにはアルファベットのすべての文字が含まれているため、結果としてtrueが期待されます。
5. 結論
このチュートリアルでは、文字列にアルファベットのすべての文字が含まれているかどうかを確認する方法について説明しました .
従来の命令型プログラミング、正規表現、Java 8ストリームを使用して、これを最初に実装する方法をいくつか見ました。
完全なソースコードはover on GitHubで入手できます。