Ответ 1
Конечно, ничего не значит, чтобы это было на языке. Я ничего не знаю ни в стандартных библиотеках, но тривиально, чтобы положить код, который вы написали, в метод утилиты, который вы можете позвонить из любой точки, где это необходимо.
Каков самый простой способ суммировать два массива по элементам?
Я знаю, что вы можете использовать цикл 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, но этот метод довольно многословный.
Конечно, ничего не значит, чтобы это было на языке. Я ничего не знаю ни в стандартных библиотеках, но тривиально, чтобы положить код, который вы написали, в метод утилиты, который вы можете позвонить из любой точки, где это необходимо.
Еще один ответ, используя потоки и предоставляя более общее решение:
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();
}
}
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
Но если вы хотите исполнить свой путь: ваше решение - лучшее, что вы можете получить, на мой взгляд!
С 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(" ")));
}
}
Добавление значения массива с их номером, например, 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();
}
проверьте это: используйте сумму и перенос
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}