#java #arrays
#java #массивы
Вопрос:
У меня есть два массива:
int [] array1 = {2, 4, 5};
int [] array2 = {1, 4, 6, 5, 2, 1};
Я хочу добавить эти два массива, я хочу этот результат:
int [] result = {3, 8, 11, 5, 2, 1};
Но какова длина результата массива?, array1.length или array2.length?
Но, у меня есть чувак, если я смогу увеличить первый массив так:
int [] array1 = {2, 4, 5, 0, 0, 0};
Извините за мой плохой английский, большое вам спасибо!
Комментарии:
1. «Но какова длина результата массива?» Гм …
Math.max(array1.length, array2.length)
?array1.length < array2.length ? array2.length : array1.length
?2. Да, но позже, когда я смогу добавить, существует ошибка: ArrayOutBoundsOfException, потому что array1 меньше, чем тот, который я хочу разрешить.
3. Ну да. Вы используете защиту, чтобы не пытаться получить доступ за пределы конца более короткого массива.
4. Вы здесь что-то делаете, но не объясняете, что это такое . Вы просто добавляете значения в одни и те же позиции массива вместе? Если это так, вы уже знаете, какой будет длина. Вы делаете что-то еще (похоже, что вы добавляете значения в индекс, но внешний вид может быть обманчивым)? Затем объясните, что вы делаете , и покажите код, который вы используете для достижения этой цели.
Ответ №1:
public int[] addArrays(int[] a1, int[] a2) {
int[] resu<
int[] smallPtr;
if (a1.length <= a2.length){
result = Arrays.copyOf(a2);
smallPtr = a1;
} else {
result = Arrays.copyOf(a1);
smallPtr = a2;
}
for (int i = 0; i < smallPtr.length; i ) {
result[i] = smallPtr[i];
}
return resu<
}
for
Цикл представляет собой довольно стандартный код, позволяющий просто добавлять элементы массивов один за другим. «Волшебство» происходит в if/else
приведенном выше утверждении вместе с result
и smallPtr
;
result
достаточно понятно, а именно результирующий массив, который будет возвращен клиенту. smallPtr
является «указателем» на меньший из двух массивов. Затем if/else
блок просто пытается определить, какой массив является наименьшим, и устанавливает его равным smallPtr
, создавая копию большего массива. Затем мы просто перебираем небольшой массив и добавляем эти элементы в копию большого массива, что дает нам ответ.
Существует несколько способов решения этой проблемы. Один из способов — просто иметь множество if
операторов внутри a, для loop
которых просто проверьте граничные условия массивов, чтобы предотвратить IndexOutOfBoundsException
s . Однако это решение пытается сделать код кратким (и, надеюсь, более простым для чтения и понимания), имея только один if/else
блок.
Ответ №2:
У меня есть два массива:
int [] array1 = {2, 4, 5}; int [] array2 = {1, 4, 6, 5, 2, 1};
Я хочу добавить эти два массива, я хочу этот результат:
результат int [] = {3, 8, 11, 5, 2, 1};
Основными проблемами здесь являются:
- как определить размер результирующего массива
- как обрабатывать асимметричные массивы
Первая задача легко решается как максимальная из двух длин массива. Решение второй задачи просто требует обработки случая, когда элемент в одном массиве не имеет партнера в другом. Вот решение:
public int[] addArrays(int[] array1, int[] array2) {
int maxLength = (array1.length > array2.length) ? array1.length : array2.length;
int index = 0;
int[] sums = new int[maxLength];
while (index < maxLength) {
sums[index] = (index < array1.length) ? array1[index] : 0;
sums[index] = (index < array2.length) ? array2[index] : 0;
index ;
}
return sums;
}
Обратите внимание, как использование троичного оператора делает этот код более читаемым, чем в случае с блочными операторами if-then .