Как объединить строки квадратного массива в один массив?
Как можно объединить строки квадратного массива в один массив?
Например, дан массив:
{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;
}