Добавление массивов разной длины

#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 .