Я пытаюсь сгладить этот массив:
int[][] arr = { {1, 2, 3},
{4, 5},
{6},
null,
{},
{7,8}};
Я вижу, что в первых двух шагах он заполняет новый массив, но затем я получаю ошибку исключения из-за пределов. Я не понимаю, где моя ошибка.
public static int[] concAr (int[][] arr) {
int countels=0;
for (int r = 0; r < arr.length; r++) {
if (arr[r] == null|| arr[r].length==0)
continue;
for (int c = 0; c < arr[r].length; c++) {
countels++;
}
}
int[] flatAr = new int[countels];
for(int i = 0; i < countels; i ++) {
if(arr[i]!=null) {
for(int j = 0; j < arr[i].length; j ++) {
flatAr[(i * arr.length) + j] = arr[i][j];
}
}
}
return flatAr;
}
Следующая индексация неверна, поскольку длины массивов различны
flatAr[(i * arr.length) + j] = arr[i][j];
Используйте это после установки count
в ноль:
flatAr[count++] = arr[i][j];
countels
- это длина сплющенного массива, в этом случае 8. Однако во втором внешнем цикле вы индексируете исходный, countels
массив до countels
, хотя ваш countels
массив имеет только 6 элементов. Как только вы пройдете мимо этих 6, вы получите исключение из-за пределов.
Во второй раз вам все равно нужно повторить так, как вы делали в первый раз, и увеличивать индекс сплющенного массива во втором наборе циклов.
for(int i = 0; i < countels; i ++) {
и это сработало.