Как объединить строки квадратного массива в один массив?

Как можно объединить строки квадратного массива в один массив?

Например, дан массив:

{1, 2, 3},
{4, 5, 6},
{7, 8, 9}

Мы должны получить:

{1, 2, 3, 4, 5, 6, 7, 8, 9};

Ответы (1 шт):

Автор решения: Alex Rudenko

Наиболее лаконичное решение с использованием Stream API и метода flatMap, вернее его варианта для int примитивов flatMapToInt:

private static int[] flatten(int[][] arr) {
    if (null == arr) return null;

    return Arrays.stream(arr) // Stream<int[]>
        .filter(Objects::nonNull)     // игнорировать null-строки
        .flatMapToInt(Arrays::stream) // IntStream
        .toArray(); // int[]
}

Тесты:

int[][] arr1 = {{1}, {2, 3}, {4, 5, 6}};
System.out.println(Arrays.toString(flatten(arr1)));
// -> [1, 2, 3, 4, 5, 6]

int[][] arr2 = {{1, 10}, {}, null, {2, 20}};
System.out.println(Arrays.toString(flatten(arr2)));
// -> [1, 10, 2, 20]

Если Stream API нельзя применять, тогда следует вычислить размер результирующего массива (в общем случае построчно), и копировать данные, например, используя стандартный метод System::arraycopy:

private static int[] flatten(int[][] arr) {
    if (null == arr) return null;
    
    int size = 0;
    for (int i = 0; i < arr.length; i++) {
        if (null != arr[i]) size += arr[i].length;
    }
    int[] res = new int[size];
    
    for (int i = 0, j = 0; i < arr.length; i++) {
        if(null != arr[i] && arr[i].length > 0) {
            System.arraycopy(arr[i], 0, res, j, arr[i].length);
            j += arr[i].length;
        }
    }

    return res;    
}
→ Ссылка