Перейти к основному содержимому

Введение в текст Apache Commons

· 4 мин. чтения

Задача: Наибольшая подстрока палиндром

Для заданной строки s, верните наибольшую подстроку палиндром входящую в s. Подстрока — это непрерывная непустая последовательность символов внутри строки. Стока является палиндромом, если она читается одинаково в обоих направлениях...

ANDROMEDA 42

1. Обзор

Проще говоря, библиотека Apache Commons Text содержит ряд полезных служебных методов для работы со строками помимо того, что предлагает ядро Java.

В этом кратком введении мы увидим, что такое Apache Commons Text и для чего он используется, а также приведем несколько практических примеров использования библиотеки.

2. Зависимость от Maven

Давайте начнем с добавления следующей зависимости Maven в наш pom.xml :

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.1</version>
</dependency>

Вы можете найти последнюю версию библиотеки в центральном репозитории Maven .

3. Обзор

Корневой пакет org.apache.commons.text разделен на несколько подпакетов:

  • org.apache.commons.text.diff — различия между строками
  • org.apache.commons.text.similarity — сходства и различия между строками
  • org.apache.commons.text.translate — перевод текста

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

3. Обработка текста

Пакет org.apache.commons.text содержит несколько инструментов для работы со строками.

Например, WordUtils имеет API-интерфейсы, способные делать первую букву каждого слова в строке заглавной, менять регистр строки и проверять, содержит ли строка все слова в заданном массиве. ``

Давайте посмотрим, как мы можем сделать первую букву каждого слова в строке заглавной :

@Test
public void whenCapitalized_thenCorrect() {
String toBeCapitalized = "to be capitalized!";
String result = WordUtils.capitalize(toBeCapitalized);

assertEquals("To Be Capitalized!", result);
}

Вот как мы можем проверить, содержит ли строка все слова в массиве:

@Test
public void whenContainsWords_thenCorrect() {
boolean containsWords = WordUtils
.containsAllWords("String to search", "to", "search");

assertTrue(containsWords);
}

StrSubstitutor предоставляет удобный способ создания строк из шаблонов:

@Test
public void whenSubstituted_thenCorrect() {
Map<String, String> substitutes = new HashMap<>();
substitutes.put("name", "John");
substitutes.put("college", "University of Stanford");
String templateString = "My name is ${name} and I am a student at the ${college}.";
StrSubstitutor sub = new StrSubstitutor(substitutes);
String result = sub.replace(templateString);

assertEquals("My name is John and I am a student at the University of Stanford.", result);
}

StrBuilder — это альтернатива Java.lang.StringBuilder . Он предоставляет некоторые новые функции, которых нет в StringBuilder .

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

Вот быстрый пример замены части строки:

@Test
public void whenReplaced_thenCorrect() {
StrBuilder strBuilder = new StrBuilder("example StrBuilder!");
strBuilder.replaceAll("example", "new");

assertEquals(new StrBuilder("new StrBuilder!"), strBuilder);
}

Чтобы очистить строку, мы можем просто сделать это, вызвав метод clear() в построителе:

strBuilder.clear();

4. Расчет разницы между строками

Пакет org.apache.commons.text.diff реализует алгоритм Майерса для вычисления различий между двумя строками.

Разница между двумя строками определяется последовательностью модификаций, которые могут преобразовать одну строку в другую.

Существует три типа команд, которые можно использовать для преобразования строки в другую — InsertCommand , KeepCommand и DeleteCommand .

Объект EditScript содержит сценарий, который следует запустить, чтобы преобразовать строку в другую. Давайте подсчитаем количество односимвольных модификаций, которые необходимо сделать, чтобы преобразовать строку в другую:

@Test
public void whenEditScript_thenCorrect() {
StringsComparator cmp = new StringsComparator("ABCFGH", "BCDEFG");
EditScript<Character> script = cmp.getScript();
int mod = script.getModifications();

assertEquals(4, mod);
}

5. Сходства и расстояния между строками

Пакет org.apache.commons.text.similarity содержит алгоритмы, полезные для поиска сходств и расстояний между строками.

Например, LongestCommonSubsequence можно использовать для поиска количества общих символов в двух строках :

@Test
public void whenCompare_thenCorrect() {
LongestCommonSubsequence lcs = new LongestCommonSubsequence();
int countLcs = lcs.apply("New York", "New Hampshire");

assertEquals(5, countLcs);
}

Точно так же LongestCommonSubsequenceDistance можно использовать для поиска количества разных символов в двух строках :

@Test
public void whenCalculateDistance_thenCorrect() {
LongestCommonSubsequenceDistance lcsd = new LongestCommonSubsequenceDistance();
int countLcsd = lcsd.apply("New York", "New Hampshire");

assertEquals(11, countLcsd);
}

6. Перевод текста

Пакет org.apache.text.translate изначально был создан, чтобы позволить нам настраивать правила, предоставляемые StringEscapeUtils .

В пакете есть набор классов, которые отвечают за перевод текста в некоторые из различных моделей кодирования символов, таких как Unicode и Numeric Character Reference. Мы также можем создавать собственные процедуры перевода.

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

@Test
public void whenTranslate_thenCorrect() {
UnicodeEscaper ue = UnicodeEscaper.above(0);
String result = ue.translate("ABCD");

assertEquals("\\u0041\\u0042\\u0043\\u0044", result);
}

Здесь мы передаем индекс символа, с которого мы хотим начать перевод, в метод вышеупомянутый() .

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

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

В этом кратком руководстве мы увидели обзор того, что такое Apache Commons Text, и некоторые из его общих функций.

Примеры кода можно найти на GitHub.