文字列をタイトルケースに変換する
1前書き
この短いチュートリアルでは、
String
をタイトルケース形式にJavaで変換する方法を説明します。
カスタムメソッドを実装するさまざまな方法を説明します。また、サードパーティのライブラリを使用してそれを実行する方法も説明します。
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();
}
ご覧のとおり、変換を行うには
Character.toTitleCase
メソッドを使用します。これは、** Unicodeの
Character
と等価のタイトルケースをチェックするためです。
これらの入力を使用してこの方法をテストすると、
tHis IS a tiTLe
tHis, IS a tiTLe
次のような期待通りの出力が得られます。
This Is A Title
This, Is A Title
2.2. 単語に分割する
これを行うもう1つの方法は、
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を使う
独自のカスタムメソッドを実装したくない場合は、Apache Commonsライブラリを使用できます。このライブラリの設定はこのリンクで説明されています:/string-processing-commons-lang[article]。
これは、
capitalizeFully()メソッドを持つ
WordUtils__クラスを提供します。
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>
最新バージョンはhttps://search.maven.org/classic/#search%7Cga%7C1%7Ca%3A%22icu4j%22%20AND%20g%3A%22com.ibm.icu%22[here]にあります。
このライブラリは
WordUtils
と非常によく似た動作をしますが、
String
をどのように分割したいのかをメソッドに指示するために
__BreakIterator
__を指定することができます。
public static String convertToTitleCaseIcu4j(String text) {
if (text == null || text.isEmpty()) {
return text;
}
return UCharacter.toTitleCase(text, BreakIterator.getTitleInstance());
}
ご覧のとおり、タイトルを扱うための特定の
BreakIterator
があります。
-
BreakIterator
を指定しないと、Unicode ** のデフォルトが使用されます。この場合、同じ結果が生成されます。
また、このメソッドを使用すると、ロケール固有の変換を実行するために、変換している
String
の____Localeを指定できます。
5結論
この短い記事では、
String
をJavaでタイトルケース形式に変換する方法を説明しました。最初にカスタム実装を使用し、その後で外部ライブラリを使用してそれを実行する方法を示しました。
いつものように、例の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/java-strings[over on GitHub]から入手可能です。