«1. Введение

В этом коротком руководстве мы покажем, как преобразовать строку в формат заглавного регистра в Java.

Мы покажем различные способы реализации пользовательского метода, а также покажем, как это сделать с помощью сторонних библиотек.

2. Основные решения Java

2.1. Перебор символов строки

Один из способов преобразовать строку в регистр заглавия — перебрать все символы строки.

Для этого, когда мы находим разделитель слов, мы делаем следующий символ заглавным. После этого мы меняем остальные символы на нижний регистр, пока не дойдем до следующего разделителя слов.

Давайте воспользуемся пробелом в качестве разделителя слов и реализуем это решение:

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 для преобразования, так как он проверяет регистр символов, эквивалентный символу. в Юникоде.

Если мы протестируем этот метод, используя следующие входные данные:

tHis IS a tiTLe
tHis, IS a   tiTLe

Мы получим следующие ожидаемые результаты:

This Is A Title
This, Is A   Title

2.2. Разделение на слова

Другой способ сделать это — разбить строку на слова, преобразовать каждое слово в заглавный регистр и, наконец, снова соединить все слова, используя тот же разделитель слов.

Давайте посмотрим на это в коде, снова используя пробел в качестве разделителя слов и полезный 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. Настройка этой библиотеки описана в этой статье.

Это предоставляет класс WordUtils с методом capitalizeFully(), который делает именно то, чего мы хотим добиться:

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

Как мы видим, это очень просто в использовании, и если мы протестируем его входные данные, как и раньше, мы получаем те же результаты:

This Is A Title
This, Is A   Title

Кроме того, класс WordUtils предоставляет еще один метод capitalize(), который работает аналогично CapitalizeFully(), за исключением того, что он изменяет только первый символ каждого слова. Это означает, что он не преобразует остальные символы в нижний регистр.

Давайте посмотрим, как мы можем это использовать:

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

Теперь, если мы проверим его с теми же входными данными, что и раньше, мы получим следующие разные выходные данные:

THis IS A TiTLe
THis, IS A   TiTLe

4. Использование ICU4J

Другая библиотека мы можем использовать ICU4J, который обеспечивает поддержку Unicode и глобализации.

Чтобы использовать его, нам нужно добавить эту зависимость в наш проект:

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

Последнюю версию можно найти здесь.

Эта библиотека работает очень похоже на WordUtils, но мы можем указать BreakIterator, чтобы сообщить методу, как мы хотим разделить строку и, следовательно, какие слова мы хотим преобразовать в заглавный регистр:

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

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

Как мы видим, у них есть специальный BreakIterator для работы с заголовками. Если мы не указываем BreakIterator, он использует значения по умолчанию из Unicode, которые в этом случае генерируют те же результаты.

Также обратите внимание, что этот метод позволяет нам указать Локаль преобразуемой строки, чтобы выполнить преобразование, зависящее от локали.

5. Заключение

В этой краткой статье мы показали, как преобразовать строку в формат заглавного регистра в Java. Сначала мы использовали наши собственные реализации, а затем показали, как это сделать с помощью внешних библиотек.

Как всегда, полный исходный код примеров доступен на GitHub.