Преобразуване на низ в заглавие

1. Въведение

В този кратък урок ще покажем как да конвертирате String в формат на заглавието в Java.

Ще покажем различни начини за внедряване на персонализиран метод и също така ще покажем как да го направим с помощта на библиотеки на трети страни.

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

2.1. Повтаряне Чрез String героите

Един от начините да конвертирате 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, за да извършим преобразуването, тъй като той проверява заглавието, еквивалентно на символ в Unicode.

Ако тестваме този метод, използвайки тези входове:

tHis IS a tiTLe tHis, IS a tiTLe

Получаваме следните очаквани резултати:

This Is A Title This, Is A Title

2.2. Разделяне на думи

Друг подход за това е разделянето на String на думи, превръщането на всяка дума в главен регистър и накрая отново се присъединява към всички думи, използвайки същия разделител на думи.

Нека го видим в кода, като използваме отново празното пространство като разделител на думи и полезния API на Stream :

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 предоставя друг метод с главни букви () , който работи подобно на капитализиране на Напълно (), с изключение на това , че променя само първия знак на всяка дума . Това означава, че не преобразува останалите символи в малки букви.

Нека да видим как можем да използваме това:

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 , които в този случай генерират същите резултати.

Също така, предупреждение, че този метод ни позволява да се уточни локал на String ние конвертиране, за да се направи на локал-специфичен реализация.

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

В тази кратка статия показахме как да конвертираме String в формат на заглавието в Java. Първо използвахме нашите персонализирани реализации, а след това показахме как да го направим с помощта на външни библиотеки.

Както винаги, пълният изходен код на примерите е достъпен в GitHub.