1. 概要

このチュートリアルでは、文字列にアルファベットのすべての文字が含まれているかどうかを確認する方法を説明します。

簡単な例を次に示します。「ファーマージャックは、大きな黄色のキルトが高価であることに気づきました。」–実際にはアルファベットのすべての文字が含まれています。

3つのアプローチについて説明します。

まず、命令型アプローチを使用してアルゴリズムをモデル化します。 次に、正規表現を使用します。 そして最後に、Java8を使用したより宣言的なアプローチを利用します。

さらに、採用されたアプローチのBig-O-complexityについても説明します。

2. 命令型アルゴリズム

命令型アルゴリズムを実装しましょう。 このために、最初に、訪問したブール配列を作成します。 次に、入力文字列を1文字ずつウォークスルーし、その文字に訪問済みのマークを付けます。

大文字小文字は同じと見なされることに注意してください。 したがって、インデックス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. Java8ストリーム

Java 8の機能を使用すると、Streamのフィルターおよび distinct メソッドを使用して、よりコンパクトで宣言的な方法で同じ結果を簡単に実現できます。

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

このアプローチのBig-O-complexityもO(n)になります。

4. テスト

アルゴリズムのハッピーパスをテストしてみましょう。

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

ここで、 statement にはアルファベットのすべての文字が含まれているため、結果としてtrueが期待されます。

5. 結論

このチュートリアルでは、文字列にアルファベットのすべての文字が含まれているかどうかを確認する方法について説明しました。.

従来の命令型プログラミング、正規表現、およびJava 8ストリームを使用して、これを最初に実装する方法をいくつか見てきました。

完全なソースコードは、GitHubから入手できます。