Разделить строку на N символов и получить массив строк можно несколькими способами (обновление: добавлены проверки на пустую строку):
- Используя
String::split
с регулярным выражением, в котором указано требуемое количество символов (см. ответ на вопрос Разделить строку по два символа):
public static String[] splitByN(String str, int n) {
return str.isEmpty() ? new String[0] : str.split("(?<=\\G.{" + n +"})");
}
- Простой цикл +
String::substring
public static String[] splitByN(String str, int n) {
int len = str.length();
String[] result = new String[len == 0 ? 0 : (len - 1) / n + 1];
for (int i = 0, j = 0; i < result.length; i++, j += n) {
result[i] = j < len - n ? str.substring(j, j + n) : str.substring(j);
}
return result;
}
- Используя Stream API +
String::substring
:
public static String[] splitByN(String str, int n) {
int len = str.length();
return IntStream.iterate(0, i -> i < len, i -> i + n)
.mapToObj(i -> i < len - n ? str.substring(i, i + n) : str.substring(i))
.toArray(String[]::new);
}
- Используя
StringBuilder
и его метод StringBuilder::delete
для удаления обработанных символов в начале строки:
public static String[] splitByN(String str, int n) {
int len = str.length();
String[] result = new String[len == 0 ? 0 : (len - 1) / n + 1];
StringBuilder sb = new StringBuilder(str);
int i = 0;
while (!sb.isEmpty()) {
int k = Math.min(sb.length(), n);
result[i++] = sb.substring(0, k);
sb.delete(0, k);
}
return result;
}
Соответственно, если строку нужно будет разбить на N частей, достаточно будет вызвать какую-то из показанных реализаций с откорректированной длиной строки после разбиения:
public static String[] splitByNParts(String str, int n) {
return splitByN(str, (str.length() - 1) / n + 1);
}
Тесты:
String str = "1001110100001110100100101111100010011000011100110101000";
System.out.println(Arrays.toString(splitByN(str, 4)));
System.out.println(Arrays.toString(splitByNParts(str, 4)));
[1001, 1101, 0000, 1110, 1001, 0010, 1111, 1000, 1001, 1000, 0111, 0011, 0101, 0000]
[10011101000011, 10100100101111, 10001001100001, 11001101010000]