Суммирование двух массивов по элементам в Java

Каков самый простой способ суммировать два массива по элементам?

Я знаю, что вы можете использовать цикл for например:

int[] a = {0, 1, 2};
int[] b = {3, 4, 5};
int[] c = new int[a.length];
for (int i = 0; i < a.length; ++i) {
    c[i] = a[i] + b[i];
}

Но в таких языках, как MATLAB, вы можете сделать сумму элемента за элементом, просто написав c = a + b. Есть ли простой способ сделать это на Java?

Метод, который приходит на ум, использует класс RealVector из Apache Commons Math, но этот метод довольно многословный.

Ответ 1

Конечно, ничего не значит, чтобы это было на языке. Я ничего не знаю ни в стандартных библиотеках, но тривиально, чтобы положить код, который вы написали, в метод утилиты, который вы можете позвонить из любой точки, где это необходимо.

Ответ 2

Еще один ответ, используя потоки и предоставляя более общее решение:

import org.junit.Assert;
import org.junit.Test;

import java.util.function.IntBinaryOperator;
import java.util.stream.IntStream;

public class SOTest {

    @Test
    public void test() {
        int[] a = {0, 1, 2};
        int[] b = {3, 4, 5};

        int[] sum = applyOn2Arrays((x, y) -> x + y, a, b);
        int[] diff = applyOn2Arrays((x, y) -> x - y, a, b);
        int[] mult = applyOn2Arrays((x, y) -> x * y, a, b);


        Assert.assertArrayEquals(new int [] {3,5,7}, sum);
        Assert.assertArrayEquals(new int [] {-3,-3,-3}, diff);
        Assert.assertArrayEquals(new int [] {0,4,10}, mult);
    }

    private int[] applyOn2Arrays(IntBinaryOperator operator, int[] a, int b[]) {
        return IntStream.range(0, a.length)
                .map(index -> operator.applyAsInt(a[index], b[index]))
                .toArray();
    }
}

Ответ 3

c = a + b Есть ли простой способ сделать это в Java?

Нет, это не так просто, потому что вы не можете переопределять операторов в java.

Вы можете использовать javax.vecmath.Vector3d (поскольку @crush сказал это в другом комментарии [к нему]), который поддерживает добавление, но это делает не что иное, как добавление значений:

/**
  * Sets the value of this tuple to the vector sum of itself and tuple t1.
  * @param t1  the other tuple
  */
public final void add(Tuple3d t1) {
    x += t1.x;
    y += t1.y;
    z += t1.z;
}

вы используете его следующим образом:

vectorC = vectorA.copy().add(vectorB);
//you need to copy the vectorA because add manipulates the object your calling it on

или Использовать библиотеку, такую как JScience, у которой есть mathematical- Vektor

Но если вы хотите исполнить свой путь: ваше решение - лучшее, что вы можете получить, на мой взгляд!

Ответ 4

С Java 8 Streams это очень легко сделать. И этот метод очень эффективен при добавлении массива большого размера.

class TestClass {
    public static void main(String args[] ) throws Exception {
       Scanner scan = new Scanner(System.in);
       Integer arrSize = scan.nextInt();
       Integer firstArr[] = new Integer[arrSize];
       Integer secArr[] = new Integer[arrSize];
       Integer sumArr[] = new Integer[arrSize];
       for(int i = 0; i < arrSize; i++) firstArr[i] = scan.nextInt();
       for(int i = 0; i < arrSize; i++) secArr[i] = scan.nextInt();
       IntStream.range(0, arrSize).forEach(i -> sumArr[i] = firstArr[i] + secArr[i]);
       System.out.println(Arrays.asList(sumArr).stream().map(n->n.toString()).collect(Collectors.joining(" ")));
   }
}

Ответ 5

Добавление значения массива с их номером, например, 21+9 = 30. когда 9+1=10 десятков мест, стоимость заимствуется и добавляется к десяткам мест. Где форма Java 8, результат 21+9 = 210.

Array 1      +  Array 2    = Reslut Array    ~ Java8 Result

{0, 1, 2}    +  {3, 4, 9}  = [0, 3, 6, 1]    ~ [3, 5, 11]
{0, 1, 2, 1} +  {3, 4, 9}  = [0, 0, 4, 7, 0] ~ [3, 5, 11, 1]

Простая логика Java для всех двух значений массивов в одном массиве:

ПРИМЕЧАНИЕ. Длина первого массива должна быть больше длины второго массива.

public static int[] arraysAddition_Int(int[] a1, int[] a2) {
    int borrowing = 0;
    int[] resultArr = new int[a1.length+1];
    for (int i = a1.length - 1, j = a2.length - 1; i >= 0; i--, j--) {
        int n1 = a1[i];
        int n2 = 0;
        if (j >= 0) {
            n2 = a2[j];
        }

        int temp = n1 + n2 + borrowing;
        borrowing = 0; // After adding make it as ZERO.

        if (temp > 9) {
            borrowing = 1;
            temp -= 10;
        }
        resultArr[i+1] = temp;
    }
    if (borrowing > 0) {
        resultArr[0] = borrowing;
    }
    System.out.format("[%s + %s]=[%s]\n --- \n",
           Arrays.toString(a1), Arrays.toString(a2), Arrays.toString(resultArr));
    return resultArr;
}

Используя Java 8:

private static int[] arraysAddition_java8(int[] a, int b[]) {
    int startInclusive = 0, endExclusive = Math.max(a.length, b.length);
    IntUnaryOperator mapper = index -> (index < a.length ? a[index] : 0) + (index < b.length ? b[index] : 0);

    return IntStream.range(startInclusive, endExclusive).map(mapper).toArray();
}

Ответ 6

проверьте это: используйте сумму и перенос

public class SumOfTwoArrays{    

    public static int[] sumOfTwoArrays(int[] arr1, int[] arr2){

        int na = arr1.length;
        int nb = arr2.length;
        int nc;
        int min;

        if(na > nb){
            nc = na + 1;
            min = nb;
        }else{
            nc = nb + 1;
            min = na;
        }

        int[] c = new int[nc];
        int sum = 0;
        int carry = 0;
        int i = na - 1;
        int j = nb - 1;
        int k = nc - 1;

        while(i >= 0 && j>=0){
            sum  = arr1[i] + arr2[j] + carry;
            i--;
            j--;
            c[k] = sum % 10;
            sum = sum / 10;
            carry = sum % 10;
            k--;        
        }//end of while loop

        while(i >= 0){          //n2 has exhausted
            sum  = arr1[i] + carry;
            c[k] = sum % 10;
            sum = sum / 10;
            carry = sum % 10;
            i--;
            k--;
        }

        while(j >= 0){        //n1 has exhausted  
            sum  = arr2[j] + carry;
            c[k] = sum % 10;
            sum = sum / 10;
            carry = sum % 10;
            k--;        
            j--;
        }

        c[k] = carry;

        return c;
    }
}

Вход: arr1 = {2, 1, 3}; arr2 = {3, 2};

Выход: c: {0, 2, 4, 5}