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

Разделить строку через каждые n символов в Java

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

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

1. Обзор

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

Во-первых, мы начнем с изучения возможных способов сделать это с помощью встроенных методов Java. Затем мы собираемся продемонстрировать, как достичь той же цели с помощью Guava.

2. Использование метода String#split

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

Давайте посмотрим на это в действии:

public static List<String> usingSplitMethod(String text, int n) {
String[] results = text.split("(?<=\\G.{" + n + "})");

return Arrays.asList(results);
}

Как видим, мы использовали регулярное выражение (?<=\\G.{" + n + "}) , где n — количество символов. Это положительное ретроспективное утверждение , которое соответствует строке, в которой последнее совпадение (\G) сопровождается n символами .

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

public class SplitStringEveryNthCharUnitTest {

public static final String TEXT = "abcdefgh123456";

@Test
public void givenString_whenUsingSplit_thenSplit() {
List<String> results = SplitStringEveryNthChar.usingSplitMethod(TEXT, 3);

assertThat(results, contains("abc", "def", "gh1", "234", "56"));
}
}

3. Использование метода String#substring

Другой способ разделить объект String по каждому n-му символу — использовать метод подстроки .

По сути, мы можем перебрать строку и вызвать подстроку , чтобы разделить ее на несколько частей на основе указанных n символов:

public static List<String> usingSubstringMethod(String text, int n) {
List<String> results = new ArrayList<>();
int length = text.length();

for (int i = 0; i < length; i += n) {
results.add(text.substring(i, Math.min(length, i + n)));
}

return results;
}

Как показано выше, метод подстроки позволяет нам получить часть строки между текущим индексом i и i+n.

Теперь давайте подтвердим это с помощью тестового примера:

@Test
public void givenString_whenUsingSubstring_thenSplit() {
List<String> results = SplitStringEveryNthChar.usingSubstringMethod(TEXT, 4);

assertThat(results, contains("abcd", "efgh", "1234", "56"));
}

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

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

Итак, с правильным регулярным выражением мы можем использовать Pattern для достижения нашей цели:

public static List<String> usingPattern(String text, int n) {
return Pattern.compile(".{1," + n + "}")
.matcher(text)
.results()
.map(MatchResult::group)
.collect(Collectors.toList());
}

Как мы видим, мы использовали «.{1,n}» в качестве регулярного выражения для создания нашего объекта Pattern . Он соответствует как минимум одному и не более чем n символам.

Наконец, давайте напишем простой тест:

@Test
public void givenString_whenUsingPattern_thenSplit() {
List<String> results = SplitStringEveryNthChar.usingPattern(TEXT, 5);

assertThat(results, contains("abcde", "fgh12", "3456"));
}

5. Использование гуавы

Теперь, когда мы знаем, как разбить строку на каждые n символов, используя базовые методы Java, давайте посмотрим, как сделать то же самое с помощью библиотеки Guava :

public static List<String> usingGuava(String text, int n) {
Iterable<String> parts = Splitter.fixedLength(n).split(text);

return ImmutableList.copyOf(parts);
}

Guava предоставляет класс Splitter для упрощения логики извлечения подстрок из строки. Метод fixedLength() разбивает заданную строку на части указанной длины .

Давайте проверим наш метод на тестовом примере:

@Test
public void givenString_whenUsingGuava_thenSplit() {
List<String> results = SplitStringEveryNthChar.usingGuava(TEXT, 6);

assertThat(results, contains("abcdef", "gh1234", "56"));
}

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

Подводя итог, мы объяснили, как разделить строку по каждому n-му символу, используя методы Java.

После этого мы показали, как добиться той же цели, используя библиотеку Guava.

Как всегда, код, использованный в этой статье, можно найти на GitHub .