1. 序章

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

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

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

2.1. 文字列文字の反復

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();
}

ご覧のとおり、メソッド Character.toTitleCase を使用して変換を行います。これは、がUnicodeの文字に相当するタイトルケースをチェックするためです。

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

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. ApacheCommonsの使用

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

これにより、 WordUtilsクラスが提供されます。このクラスには、capitalizeFully()メソッドがあり、これはまさに私たちが達成したいことを実行します。

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

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

This Is A Title
This, Is A   Title

また、 WordUtils クラスは、のみ の変更を除いて、 CapitalizeFully()と同様に機能する別のcapitalize()メソッドを提供します各単語の最初の文字。 これは、残りの文字が小文字に変換されないことを意味します。

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

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

ここで、以前と同じ入力でテストすると、次の異なる出力が得られます。

THis IS A TiTLe
THis, IS A   TiTLe

4. ICU4Jの使用

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

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

<dependency>
    <groupId>com.ibm.icu</groupId>
    <artifactId>icu4j</artifactId>
    <version>61.1</version>
</dependency>

最新バージョンはここにあります。

このライブラリはWordUtilsと非常によく似た方法で機能しますが、 BreakIterator を指定して、 String を分割する方法、つまりタイトルケースに変換したい単語:

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

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

ご覧のとおり、タイトルを操作するための特定のBreakIteratorがあります。 BreakIteratorを指定しない場合、Unicode のデフォルトが使用されます。この場合、同じ結果が生成されます。

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

5. 結論

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

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