При роботі з даною задачею я не зрозуміла як працює система.
дано:
int[] firstArray = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, };
int[] secondArray = new int[]{10, 11, 12, 13, 14, 15, 16, 17, 18, 19,};
потрібно дані з них об'єднати в int[] resultArray;
командою resultArray = new int[firstArray.length + secondArray.length];
простро присвоюється кількіть комірок масиву відповідно до кількості попередніх двох, командою for (int i = 0; i < firstArray.length; i++) дізнаємо дані з кожної комірки firstArray, далі за допомогою resultArray[i] = firstArray[i];
ці дані присвоюються resultArray, а якщо вивести на екран бачу перші дані з комірок присвоєні, далі "0", це я зрозуміла. За допомогою for (int i = 0; i < secondArray.length; i++) дізнаємо дані наступного масиву, але як за допомогою команди resultArray[i + firstArray.length] = secondArray[i]; присвоюються дані іменно наступним коміркам не можу збагнути, і чому + firstArray.length , а не secondArray.length? Допоможіть розібратися. Дякую.
Hapon Olha
10 уровень
Об'єднуємо масиви - допоможіть зрозуміти
Комментарии (3)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Денис Enterprise Java Developer
9 февраля, 22:54
Тому що при заповненні другої половини масива i в тебе ітерується з нуля до довжини другого масива, але в результуючому масиві цільовий індекс повинен бути іншим, точніше починатись після елементів першого масива. Не забувай також, що обидва массиви first та second можуть мати будьяку кількість елементів.
Тобто "+ firstArray.length" - це просто зсув кординати у цільовому масиві.
От у такому прикладі, що відбудеться у другому циклі якщо використати secondArray.length замість first?
+1
Hapon Olha
10 февраля, 07:06
Дякую. Я проводила "експеремент", якщо два масива мають однакову кількість елементів, то при (і + масива.довжина) або навіть просто кількість елементів, як в моєму прикладі 10, то код спрацьовує нормально, але якщо кількість елементів різна i + масив той що з більшою кількітю елементів, то код не скомпліюється через помилку "Index 23 out of bounds for length 23", а якщо навпаки, з меншею, то відбувається заміна значень елементів різниці, а в кінці залишаться елементи без значень "0". я правильно розумію, що наприклад
private static int[] firstArray = {1, 2, 3};
private static int[] secondArray = {9, 8, 7, 6, 5, 4};
private static int[] resultArray;
public static void main(String[] args) {
resultArray = new int[firstArray.length + secondArray.length];
for (int i = 0; i < firstArray.length; i++) {
resultArray[i] = firstArray[i];
}
for (int i = 0; i < secondArray.length; i++) {
resultArray[i + secondArray.length] = secondArray[i];
то відбудеться {1, 2, 3, 0, 0, 0, 9, 8, 7, 6, 5, 4} але через те що масив має тільки 9 елементів і не має до чого присвоїти значення "6, 5, 4", відбувається помилка?
0
Денис Enterprise Java Developer
10 февраля, 08:44
Код скомпілюється, він просто впаде при виконанні. Помилка каже що поточний індекс виходить за межі масива, що й не дивно.
Наведенний код теж не вірний та вилетить за межі массиву. Сумарна кількість елементів - 10, ваш приклад з нульовими елементами складається з 12и. Тобто цей код такий масив просто не створює.
Але дійсно, з такою реалізацією у вас будуть нульові елементи у початку resultArray, бо secondArray записується не одразу після елементів першого, а починаючи з індекса рівного довжині другого (більшого у цьому прикладі) масиву. Але звісно у якийсь момент цей "i + secondArray.length" будуть більшими за максимальний індекс в resultArray та ви знов побачите IndexOutOfBoundException
Також треба зазначити, що якби перший масив був довший за другий, у вашому прикладі могло б не вилетіти помилки, але ви затерли би елементи першого массиву.
Як бачите той самий зсув на довжину саме першого масиву є необхідним для реалізації роботи цього коду. В інакшому випадку ви або будете втрачати данні або код просто впаде. Єдиним вийнятком є ситуація коли масиви мають рівну кількість елементів, але це саме вийняток і не можна будувати логіку на ньому.
+1