2. Checking for Vowel Using the indexOf method

1. 概要

String、の文字を処理する場合、特定のグループに属しているかどうかに応じて文字を分類したい場合があります。 たとえば、英語のアルファベットの文字は母音または子音のいずれかです。

このチュートリアルでは、文字が母音であるかどうかを確認するためのいくつかの方法を見ていきます。 これらのメソッドを他の文字グループに簡単に拡張できます。

2. Checking for Vowel Using the indexOf Method

すべての母音がわかっているので、大文字と小文字の両方でStringに追加できます。

String VOWELS = "aeiouAEIOU";

StringクラスのindexOfメソッドを使用して、文字が存在するかどうかを確認できます

boolean isInVowelsString(char c) {
    return VOWELS.indexOf(c) != -1;
}

文字が存在する場合、インデックスは-1にはなりません。 -1 の場合、その文字は母音のセットに含まれていません。 これをテストしてみましょう:

assertThat(isInVowelsString('e')).isTrue();
assertThat(isInVowelsString('z')).isFalse();

ここでは、Javaでcharを使用しています。 文字が単一文字のStringオブジェクトである場合、別の実装を使用できます。

boolean isInVowelsString(String c) {
    return VOWELS.contains(c);
}

同じテストに合格します。

assertThat(isInVowelsString("e")).isTrue();
assertThat(isInVowelsString("z")).isFalse();

ご覧のとおり、このメソッドには小さな実装オーバーヘッドがあります。 ただし、グループ内に何かがあるかどうかを判断するには、母音文字列内の10個の可能な母音を反復処理する必要があります。

3. スイッチを使用した母音の確認

代わりに、各母音が別々のケースであるswitchステートメントを使用することができます

boolean isVowelBySwitch(char c) {
    switch (c) {
        case 'a':            
        case 'e':           
        case 'i':           
        case 'o':            
        case 'u':            
        case 'A':
        case 'E':            
        case 'I':           
        case 'O':            
        case 'U':
            return true;
        default:
            return false;
    }
}

これをテストすることもできます:

assertThat(isVowelBySwitch('e')).isTrue();
assertThat(isVowelBySwitch('z')).isFalse();

JavaはスイッチステートメントでStringをサポートしているため、これを1文字の文字列で実装することもできます。

4. 正規表現を使用した母音のチェック

独自の文字列照合アルゴリズムを実装できますが、 Java正規表現エンジンを使用すると、文字列を強力に照合できます。

母音を認識する正規表現を作成しましょう。

Pattern VOWELS_PATTERN = Pattern.compile("[aeiou]", Pattern.CASE_INSENSITIVE);

[] は、文字クラスを表すために使用されます。 大文字と小文字を区別しない方法で一致させることができるため、母音は小文字のみでこのクラスに入れています。

String オブジェクトのマッチングアルゴリズムを、次の1文字で実装してみましょう。

boolean isVowelByRegex(String c) {
    return VOWELS_PATTERN.matcher(c).matches();
}

これをテストしてみましょう:

assertThat(isVowelByRegex("e")).isTrue();
assertThat(isVowelByRegex("E")).isTrue();

ご覧のとおり、正規表現では大文字と小文字が区別されません。

これには、入力が文字ではなく文字列である必要があることに注意してください。 ただし、CharacterクラスのtoStringメソッドを使用して、文字を文字列に変換できます。

assertThat(isVowelByRegex(Character.toString('e'))).isTrue();

正規表現を使用すると、この問題の一般的なケースを簡単に処理できます。 文字範囲を含む文字クラスを使用して、文字の任意のグループを指定できます。

5. どのソリューションを使用する必要がありますか?

String ベースのソリューションは、分類する文字ごとに最大10個のオプションをチェックするだけでよいため、おそらく最も理解しやすく、非常にうまく機能します。

ただし、通常、switchステートメントはStringルックアップよりも高速に実行されると予想されます。

Patterncompileメソッド中に正規表現が最適化されるため、正規表現ソリューションは非常にうまく機能するはずです。 ただし、正規表現は実装がより複雑になる可能性があり、母音の検出のような単純なものでは複雑にする価値がない場合があります。 同様に、 char 値を使用している場合、正規表現には他のメソッドでは必要とされない変換が必要です。

ただし、正規表現を使用すると、文字を分類するための高度な式を実装できます

6. 結論

この記事では、文字が母音であるかどうかを識別するいくつかの異なる方法を見てきました。 すべての母音を含む文字列を使用する方法と、switchステートメントを実装する方法を確認しました。

最後に、正規表現を使用して、このケースやより一般的なケースを解決する方法を確認しました。

いつものように、このチュートリアルの完全なコードは、GitHubにあります。