Рубрики
Без рубрики

Преобразование строки в регистр заголовка

Посмотрите на различные способы преобразования строки в регистр заголовка в Java

Автор оригинала: Marcos Lopez Gonzalez.

1. введение

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

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

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

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

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

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

tHis IS a tiTLe
tHis, IS a   tiTLe

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

This Is A Title
This, Is A   Title

2.2. Разбиение На Слова

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

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

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


    com.ibm.icu
    icu4j
    61.1

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

Эта библиотека работает очень похоже на 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. Заключение

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

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