Почему я получаю - ArrayIndexOutOfBoundsException: 5?

У меня есть два отсортированных массива. Мне нужно соединить их обоих в один новый отсортированный массив:

    int[] arr1 = {1,2,3,6,8};
    int[] arr2 = {4,5,9,12,208,234};
    printArr(allSort(arr2,arr1));
}

public static int[] allSort(int[] arr, int[] arr3) {

    int[] newArr = new int[arr.length + arr3.length];

    int j = 0;
    int k = 0;

    for (int i = 0; i < newArr.length - 1; i++) {
        if (j == arr3.length){
            newArr[i] = arr[k];
            k++;
        }
        if (k == arr.length){
            newArr[i] = arr3[j];
            j++;
        }
        if (arr[k] > arr3[j]){
            newArr[i] = arr3[j];
            j++;
        } else if (arr[k] < arr3[j]) {
            newArr[i] = arr[k];
            k++;
        }
    }
    return newArr;
}

Я попытался построить массив, длина которого равна длине обоих массивов, суммированных вместе, а затем запустить на нем цикл.

Однако этот код возвращает ошибку: AArrayIndexOutOfBoundsException: 5.

Что происходит, когда arr[k] == arr3[j]?

stark 30.06.2019 03:15

Добавьте их в один массив. Затем вы можете использовать Arrays.sort() в java.utils.Array.

grolschie 30.06.2019 03:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
93
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Просто добавьте continue в оба условия if, подобные этому,

if (j == arr3.length){
  newArr[i] = arr[k];
  k++;
  continue;
}
if (k == arr.length){
  newArr[i] = arr3[j];
  j++;
  continue;
}

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

Также,

for (int i = 0; **i < newArr.length**; i++)

Поскольку вы проверяете "<".

Я попробовал ваше первое решение, и оно не изменило проблему. Мой учитель сказал мне не использовать то, что мы еще не выучили. и мы не узнали о продолжении. поэтому я не могу его использовать.

Sufferring 30.06.2019 03:32

Я отредактировал сейчас, пожалуйста, попробуйте, это сработает

Arun Prasat 30.06.2019 03:33

предложение продолжить было довольно полезным, но я не могу его использовать... я пытался изменить цикл, он все еще индекс массива...: 5.

Sufferring 30.06.2019 03:36

попробуй это, логическая проверка = ложь; for (int i = 0; i < newArr.length; i++) { if (j == arr3.length && k != arr.length){ newArr[i] = arr[k]; к++; проверка = истина; } if (k == arr.length && j != arr3.length){ newArr[i] = arr3[j]; j++; проверка = истина; } if (!check && arr[k] > arr3[j]){ newArr[i] = arr3[j]; j++; } else if (!check && arr[k] < arr3[j]) { newArr[i] = arr[k]; к++; } }

Arun Prasat 30.06.2019 03:38

это работает, но в нем отсутствуют два целых числа, последние два числа в arr2 (208 и 234), плюс мне бы хотелось краткое объяснение ... и подведите меня к вашему мышлению, пожалуйста :)

Sufferring 30.06.2019 03:49

на самом деле вам нужно удалить «-1» в for (int i = 0; я < newArr.length; i++), Объяснение, вот что я сделал, если он перешел в любой из первых двух, если условие это означает, что один из массивов достигнут его конец, поэтому нам не нужно проверять друг друга. Вот почему я добавил проверку, чтобы игнорировать условие сортировки.

Arun Prasat 30.06.2019 03:53

О, хорошо :) большое спасибо. Но почему отсутствуют два целых числа?

Sufferring 30.06.2019 03:55

int[] newArr = новый int[arr.length + arr3.length]; Это должно быть так, иначе размер будет уменьшен, и он не сможет вместить последние два элемента массива. Я рад, что помог вам :) пожалуйста, примите ответ

Arun Prasat 30.06.2019 03:58

ArrayIndexOutOfBoundsException() — это Исключение, и в основном это означает, что в какой-то момент вы пытаетесь получить доступ к элементу массива с индексом незаконный. Обратитесь к Документация по исключению ArrayIndexOutOfBoundsException для получения дополнительной информации.

после просмотра вашего кода в какой-то момент вот значения индекса:

.

В цикле вы вызываете arr[k] с k = 5 в if (arr[k] > arr3[j]), поскольку arr является массивом длины 5 и, следовательно, имеет максимальный индекс 4, и поэтому вы получаете исключение за пределами.

Как я могу исключить k = 5? Я пробовал ifs проверить, 5 это или нет, но у меня не получилось

Sufferring 30.06.2019 03:54

@Sufferring Вы можете просто добавить оператор if, и в цикле, например if (k<5), вы заметите, что ваш метод работает правильно, не вызывая никаких исключений, однако вы не получите правильный результат, проблема в том, что ваш код неверен. Вы делаете что-то не так в методе allSort.

Kil jeaden 30.06.2019 04:04

Ваша основная проблема - контроль, когда первый массив закончен.

Я внес некоторые коррективы в ваш код, и теперь он работает.

public static void main(String[] args) {
    int[] arr1 = { 1, 2, 3, 6, 8 };
    int[] arr2 = { 4, 5, 9, 12, 208, 234 };

    int[] newArr = allSort(arr1, arr2);

    for (int i = 0; i <= newArr.length - 1; i++) {
        System.out.println(" " + newArr[i]);
    }
}

public static int[] allSort(int[] arr1, int[] arr2) {
    int j = 0;
    int k = 0;
    boolean endArr1 = false;
    int[] newArr = new int[arr1.length + arr2.length];

    for (int i = 0; i <= newArr.length - 1; i++) {
        if (arr1[k] < arr2[j] && !endArr1) {
            System.out.println("k: " + k + " " + arr1.length);
            newArr[i] = arr1[k];
            if (k < arr1.length-1)
                k++;
            else
                endArr1 = true;
       } else if (arr2[j] < arr1[k]  || endArr1) {
           System.out.println("j: " + j + " " + arr2.length);
           newArr[i] = arr2[j];
           if (j < arr2.length-1)
               j++;
         }
    }
    return newArr;
}

Другие вопросы по теме