Разделение строки на равные подстроки в Java: методы и примеры
Быстрый ответ
Для разделения строки в Java на части одинакового размера можно использовать цикл for
в сочетании с методом substring()
. Вот пример кода, который разбивает строку str
на фрагменты длиной n
:
String str = "exampleString"; // наша образцовая строка
int n = 3;
List<String> chunks = new ArrayList<>();
for (int i = 0; i < str.length(); i += n) {
chunks.add(str.substring(i, Math.min(str.length(), i + n)));
}
В результате в списке chunks
получим подстроки длиной n
символов каждая. При этом учитывается и последняя подстрока, которая может быть короче.
Анализ процесса
В Java существует множество способов разделения строк. Давайте посмотрим на инструменты, которые мы можем использовать для решения этой задачи.
Обсуждение regex и non-regex
Регулярные выражения обеспечивают быстрое разделение строк, например так:
String[] substrings = str.split("(?<=\\G.{" + n + "})"); // почти магия
Тем не менее, у них есть недостатки:
- Сложность: Регулярные выражения увеличивают сложность кода, особенно при работе с подстроками разной длины.
- Производительность: Нередко подходы без применения регулярных выражений бывают более эффективными и надёжными.
- Совместимость: Некоторые платформы, включая Android, не поддерживают использование
\G
в регулярных выражениях. - Читаемость: Код без использования регулярных выражений значительно понятнее.
Рассматриваемые библиотеки
Библиотека Guava от Google предоставляет удобные инструменты для работы со строками:
Iterable<String> chunks = Splitter.fixedLength(n).split(str);
Этот подход с применением константы splitter предельно удобен, а также обеспечивает легкость повторного использования.
Обход UTF-16
Если ваши строки содержат символы вне Базовой многоязычной плоскости (BMP), учтите, что Java кодирует их двумя символами char
. Поэтому, разбивая строки, следует быть осторожными, чтобы не столкнуться с непредвиденными проблемами.
Обработка неожиданностей
В программировании умение управлять граничными случаями — залог успеха. Не допускайте, чтобы они управляли вами.
Обработка крайних случаев
Вместо использования Math.ceil()
, которое может привести к проблемам с вычислениями с плавающей точкой, вычислите количество подстрок вручную:
int numChunks = (str.length() + n – 1) / n;
Эффективное разделение на подстроки с переменной длиной
Если требуется получить подстроки разной длины, эффективнее будет организовать пользовательский цикл без использования сложных и неэффективных регулярных выражений.
Кэширование вашего splitter'а
Если регулярно требуется разделять строки, сохраните splitter в константу — это улучшит эффективность алгоритма и возможности для повторного использования. Отлично, если можно съесть кусок торта и сохранить его!
Избегайте ловушек регулярных выражений
Регулярные выражения могут быть полезными, но не всегда подходят для задач, требующих масштабности и кроссплатформенности.
Визуализация
Представьте процесс разделения строки. Как будто вы разрезаете её на равные части:
До разделения: |🍫🍫🍫🍫🍫🍫🍫🍫|
А после — получаете:
После разделения: |🍫🍫|🍫🍫|🍫🍫|🍫🍫|
В Java это будет выглядеть так:
"Chocolate".match(/.{1,2}/g); // "Ch", "oc", "ol", "at", "e"
Здесь каждая пара 🍫🍫 — это подстрока, а целая строка — это то, что было раньше, целый шоколадный батончик.
Полезные материалы
- String (Java Platform SE 8) — изучение класса
String
в Java. - StringUtils (Apache Commons Lang 3.14.0 API) — инструментарий для работы со строками.
- Split string to equal length substrings in Java – Stack Overflow — обсуждение способов разделения строки на подстроки в сообществе.
- Split() String method in Java with examples – GeeksforGeeks — анализ метода
split()
. - Pattern (Java Platform SE 8 ) — обновите свои знания о регулярных выражениях.
- Substring in Java – javatpoint — подробнее о методе
substring
. - Parse text – Java Practices — сжатый курс по разделению строк.