Как мне разделить строку?

Рейтинг: -2Ответов: 1Опубликовано: 03.08.2023

Как мне разделить строку на равные части по 4?

String binary = 
"10011101000011101001001011111000100110000111001101010000";

должен получиться результат "1001" "1101" "0000" "1110" "1001" "0010" "1111" "1000" "1001" "1000" "0111" "0011" "0101" "0000"

Ответы

▲ 3Принят

Разделить строку на N символов и получить массив строк можно несколькими способами (обновление: добавлены проверки на пустую строку):

  1. Используя String::split с регулярным выражением, в котором указано требуемое количество символов (см. ответ на вопрос Разделить строку по два символа):
public static String[] splitByN(String str, int n) {
    return str.isEmpty() ? new String[0] : str.split("(?<=\\G.{" + n +"})");
}
  1. Простой цикл + 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;
}
  1. Используя 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);
}
  1. Используя 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]