У меня есть два отсортированных массива. Мне нужно соединить их обоих в один новый отсортированный массив:
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.
Добавьте их в один массив. Затем вы можете использовать Arrays.sort() в java.utils.Array.




Просто добавьте 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++)
Поскольку вы проверяете "<".
Я попробовал ваше первое решение, и оно не изменило проблему. Мой учитель сказал мне не использовать то, что мы еще не выучили. и мы не узнали о продолжении. поэтому я не могу его использовать.
Я отредактировал сейчас, пожалуйста, попробуйте, это сработает
предложение продолжить было довольно полезным, но я не могу его использовать... я пытался изменить цикл, он все еще индекс массива...: 5.
попробуй это, логическая проверка = ложь; 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]; к++; } }
это работает, но в нем отсутствуют два целых числа, последние два числа в arr2 (208 и 234), плюс мне бы хотелось краткое объяснение ... и подведите меня к вашему мышлению, пожалуйста :)
на самом деле вам нужно удалить «-1» в for (int i = 0; я < newArr.length; i++), Объяснение, вот что я сделал, если он перешел в любой из первых двух, если условие это означает, что один из массивов достигнут его конец, поэтому нам не нужно проверять друг друга. Вот почему я добавил проверку, чтобы игнорировать условие сортировки.
О, хорошо :) большое спасибо. Но почему отсутствуют два целых числа?
int[] newArr = новый int[arr.length + arr3.length]; Это должно быть так, иначе размер будет уменьшен, и он не сможет вместить последние два элемента массива. Я рад, что помог вам :) пожалуйста, примите ответ
ArrayIndexOutOfBoundsException() — это Исключение, и в основном это означает, что в какой-то момент вы пытаетесь получить доступ к элементу массива с индексом незаконный. Обратитесь к Документация по исключению ArrayIndexOutOfBoundsException для получения дополнительной информации.
после просмотра вашего кода в какой-то момент вот значения индекса:
В цикле вы вызываете arr[k] с k = 5 в if (arr[k] > arr3[j]), поскольку arr является массивом длины 5 и, следовательно, имеет максимальный индекс 4, и поэтому вы получаете исключение за пределами.
Как я могу исключить k = 5? Я пробовал ifs проверить, 5 это или нет, но у меня не получилось
@Sufferring Вы можете просто добавить оператор if, и в цикле, например if (k<5), вы заметите, что ваш метод работает правильно, не вызывая никаких исключений, однако вы не получите правильный результат, проблема в том, что ваш код неверен. Вы делаете что-то не так в методе allSort.
Ваша основная проблема - контроль, когда первый массив закончен.
Я внес некоторые коррективы в ваш код, и теперь он работает.
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;
}
Что происходит, когда
arr[k] == arr3[j]?