2016-10-15 3 views
1

У меня есть два массива:Добавить массивы разной длины

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?

Но, у меня есть чувак, если я могу amplied первый массив так:

int [] array1 = {2, 4, 5, 0, 0, 0}; 

К сожалению мой плохой английский, спасибо большое!

+3

* «Но какова длина результата массива?» * Um ... ['Math.max (array1.length, array2.length)'] (http://docs.oracle.com/javase /8/docs/api/java/lang/Math.html#max-int-int-)? 'array1.length

+0

Да, но позже, когда я могу добавить, существует ошибка: ArrayOutBoundsOfException, потому что массив1 меньше, чем тот, который я хочу решить. –

+0

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

ответ

1
public int[] addArrays(int[] a1, int[] a2) { 
    int[] result; 
    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 result; 
} 

for петля довольно стандартный код, просто добавьте элементы массива один за другим. «Магия» происходит в заявлении if/else выше вместе с result и smallPtr;

result достаточно понятно, а именно массив результатов, который будет возвращен клиенту. smallPtr - это «указатель» на меньший из двух массивов. Затем блок if/else просто пытается определить, какой массив является наименьшим, и устанавливает его равным smallPtr, делая копию большего массива. Затем мы просто прокручиваем небольшой массив и добавляем эти элементы в копию большого массива, давая нам ответ.

Существует несколько способов решения этой проблемы. Один из способов состоит в том, чтобы просто иметь тонны if операторов внутри a для loop, которые просто проверяют граничные условия массивов, чтобы предотвратить IndexOutOfBoundsException s. Однако это решение пытается сделать код кратким (и, надеюсь, легче читать и понимать), просто имея один блок if/else.

0

I have two arrays:

int [] array1 = {2, 4, 5}; int [] array2 = {1, 4, 6, 5, 2, 1};

I want add these two arrays, I want this result:

int [] result = {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; 
} 

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

Смежные вопросы