文字列をタイトルケースに変換する

文字列をタイトルケースに変換する

1. 前書き

この短いチュートリアルでは、JavaでStringをタイトルケース形式に変換する方法を示します。

カスタムメソッドを実装するさまざまな方法を示し、サードパーティのライブラリを使用して実装する方法も示します。

2. コアJavaソリューション

2.1. String文字の反復

Stringをタイトルケースに変換する1つの方法は、Stringのすべての文字を反復処理することです。

そのために、単語の区切りを見つけると、次の文字を大文字にします。 その後、次の単語区切りに達するまで、残りの文字を小文字に変更します。

単語の区切り文字として空白を使用して、このソリューションを実装しましょう。

public static String convertToTitleCaseIteratingChars(String text) {
    if (text == null || text.isEmpty()) {
        return text;
    }

    StringBuilder converted = new StringBuilder();

    boolean convertNext = true;
    for (char ch : text.toCharArray()) {
        if (Character.isSpaceChar(ch)) {
            convertNext = true;
        } else if (convertNext) {
            ch = Character.toTitleCase(ch);
            convertNext = false;
        } else {
            ch = Character.toLowerCase(ch);
        }
        converted.append(ch);
    }

    return converted.toString();
}

ご覧のとおり、it checks the title case equivalent of a Character in Unicode.であるため、メソッドCharacter.toTitleCaseを使用して変換を行います。

これらの入力を使用してこのメ​​ソッドをテストする場合:

tHis IS a tiTLe
tHis, IS a   tiTLe

次の期待される出力が得られます。

This Is A Title
This, Is A   Title

2.2. 単語への分割

これを行う別のアプローチは、Stringを単語に分割し、すべての単語をタイトルケースに変換し、最後に同じ単語区切り文字を使用してすべての単語を再度結合することです。

もう一度空白を単語の区切り文字として使用し、便利なStream APIを使用して、コードで確認してみましょう。

private static final String WORD_SEPARATOR = " ";

public static String convertToTitleCaseSplitting(String text) {
    if (text == null || text.isEmpty()) {
        return text;
    }

    return Arrays
      .stream(text.split(WORD_SEPARATOR))
      .map(word -> word.isEmpty()
        ? word
        : Character.toTitleCase(word.charAt(0)) + word
          .substring(1)
          .toLowerCase())
      .collect(Collectors.joining(WORD_SEPARATOR));
}

前と同じ入力を使用すると、まったく同じ出力が得られます。

This Is A Title
This, Is A   Title

3. Apache Commonsを使用する

独自のカスタムメソッドを実装したくない場合は、ApacheCommonsライブラリを使用できます。 このライブラリの設定は、このarticleで説明されています。

これにより、達成したいことを正確に実行するthe WordUtils class, that has the capitalizeFully() methodが提供されます。

public static String convertToTileCaseWordUtilsFull(String text) {
    return WordUtils.capitalizeFully(text);
}

ご覧のとおり、これは非常に使いやすく、前と同じ入力でテストすると同じ結果が得られます。

This Is A Title
This, Is A   Title

また、WordUtilsクラスは、only changes the first character of each wordを除いて、capitalizeFully(),と同様に機能するanother capitalize() methodを提供します。 これは、残りの文字が小文字に変換されないことを意味します。

これをどのように使用できるか見てみましょう。

public static String convertToTileCaseWordUtils(String text) {
    return WordUtils.capitalize(text);
}

さて、前と同じ入力でテストすると、これらの異なる出力が得られます:

THis IS A TiTLe
THis, IS A   TiTLe

4. ICU4Jの使用

使用できるもう1つのライブラリはICU4Jで、Unicodeとグローバリゼーションのサポートを提供します。

それを使用するには、この依存関係をプロジェクトに追加する必要があります。


    com.ibm.icu
    icu4j
    61.1

最新バージョンはhereで見つけることができます。

このライブラリはWordUtilsと非常によく似た方法で機能しますが、BreakIterator を指定して、Stringを分割する方法、つまりタイトルに変換する単語をメソッドに指示できます。場合:

public static String convertToTitleCaseIcu4j(String text) {
    if (text == null || text.isEmpty()) {
        return text;
    }

    return UCharacter.toTitleCase(text, BreakIterator.getTitleInstance());
}

ご覧のとおり、タイトルを操作するための特定のBreakIteratorがあります。 If we don’t specify any BreakIterator it uses the defaults from Unicode。この場合、同じ結果が生成されます。

また、このメソッドでは、ロケール固有の変換を行うために、変換するStringLocale を指定できることに注意してください。

5. 結論

この短い記事では、JavaでStringをタイトルケース形式に変換する方法を示しました。 最初にカスタム実装を使用し、その後、外部ライブラリを使用してそれを行う方法を示しました。

いつものように、例の完全なソースコードはover on GitHubで入手できます。