Сглаживание неравномерного массива - ошибка исключения вне границ

1

Я пытаюсь сгладить этот массив:

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;
}
Теги:
arrays
multidimensional-array
concatenation

2 ответа

2
Лучший ответ

Следующая индексация неверна, поскольку длины массивов различны

flatAr[(i * arr.length) + j] = arr[i][j];

Используйте это после установки count в ноль:

flatAr[count++] = arr[i][j];
  • 0
    Спасибо! это помогает, но мне также пришлось добавить проверку на нулевой или пустой массив после for(int i = 0; i < countels; i ++) { и это сработало.
2

countels - это длина сплющенного массива, в этом случае 8. Однако во втором внешнем цикле вы индексируете исходный, countels массив до countels, хотя ваш countels массив имеет только 6 элементов. Как только вы пройдете мимо этих 6, вы получите исключение из-за пределов.

Во второй раз вам все равно нужно повторить так, как вы делали в первый раз, и увеличивать индекс сплющенного массива во втором наборе циклов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню