如何对两个二维数组的元素求和?
How to sum the elements of two 2d arrays?
我正在尝试使用 java 流 API 将两个 二维数组 的元素相互相加。
我用 一维 数组解决了这个问题,但我不知道如何进一步处理二维数组。
这里是转换代码:
public static int[][] add(final int[][] m1, final int[][] m2) {
int[][] e = new int[m2.length][m2[0].length];
for (int i = 0; i < m1.length; i++) {
for (int j = 0; j < m1[i].length; j++) {
e[i][j] = m1[i][j] + m2[i][j];
}
}
return e;
}
这是我出于相同目的而编写的代码,但仅使用 一维数组:
public static int[] addOneDimension(final int[] a, final int b[]) {
int[] c = IntStream.range(0, a.length)
.map(i -> a[i] + b[i])
.toArray();
return c;
}
特别是,我不知道如何在二维数组上使用map()
方法。
这可以通过使用 IntStream
及其方法 mapToObj
来处理行和 map
来处理每行中的元素来实现:
static int[][] add(int[][] a, int [][] b) {
return IntStream.range(0, a.length)
.mapToObj(i -> add(a[i], b[i])) // int[] is object
.toArray(int[][]::new); // create new 2D array
}
static int[] add(int[] a, int[] b) {
return IntStream.range(0, a.length)
.map(i -> a[i] + b[i]) // processing int operands
.toArray(); // IntStream.toArray() returns int[]
}
测试
int[][] a = {
{1, 2},
{3, 4}
};
int[][] b = {
{10, 20},
{30, 40}
};
System.out.println("Sum of a + b = ");
Arrays.stream(add(a, b))
.map(Arrays::toString)
.forEach(System.out::println);
输出
Sum of a + b =
[11, 22]
[33, 44]
Single-method实现可能如下:
static int[][] add2D(int[][] a, int [][] b) {
return IntStream
.range(0, a.length)
.mapToObj(i -> IntStream
.range(0, a[i].length)
.map(j -> a[i][j] + b[i][j])
.toArray()
)
.toArray(int[][]::new);
}
您可以使用Stream#reduce
方法对两个或多个二维数组的元素求和:
public static int[][] sumArrays(int[][]... arrays) {
// reduce the stream of arrays into a single
// array by sequentially summing array pairs
return Arrays.stream(arrays).reduce((a1, a2) -> IntStream
// iterate over the indices of
// the rows of the largest array
.range(0, Math.max(a1.length, a2.length))
.mapToObj(i -> IntStream
// iterate over the indices of
// the cells of the largest row
.range(0, Math.max(
i < a1.length ? a1[i].length : 0,
i < a2.length ? a2[i].length : 0))
// sum the elements of two rows if exist, or 0 otherwise
.map(j -> (i < a1.length && j < a1[i].length ? a1[i][j] : 0)
+ (i < a2.length && j < a2[i].length ? a2[i][j] : 0))
.toArray())
.toArray(int[][]::new))
.orElse(null);
}
// test
public static void main(String[] args) {
int[][] arr1 = {
{1},
{1, 1}};
int[][] arr2 = {
{2},
{2, 2},
{2, 2, 2}};
int[][] arr3 = {
{3, 3, 3, 3},
{3, 3, 3, 3},
{3, 3, 3, 3},
{3, 3, 3, 3}};
int[][] sum = sumArrays(arr1, arr2, arr3);
// output
Arrays.stream(sum).map(Arrays::toString).forEach(System.out::println);
//[6, 3, 3, 3]
//[6, 6, 3, 3]
//[5, 5, 5, 3]
//[3, 3, 3, 3]
}
另请参阅:
我正在尝试使用 java 流 API 将两个 二维数组 的元素相互相加。
我用 一维 数组解决了这个问题,但我不知道如何进一步处理二维数组。
这里是转换代码:
public static int[][] add(final int[][] m1, final int[][] m2) {
int[][] e = new int[m2.length][m2[0].length];
for (int i = 0; i < m1.length; i++) {
for (int j = 0; j < m1[i].length; j++) {
e[i][j] = m1[i][j] + m2[i][j];
}
}
return e;
}
这是我出于相同目的而编写的代码,但仅使用 一维数组:
public static int[] addOneDimension(final int[] a, final int b[]) {
int[] c = IntStream.range(0, a.length)
.map(i -> a[i] + b[i])
.toArray();
return c;
}
特别是,我不知道如何在二维数组上使用map()
方法。
这可以通过使用 IntStream
及其方法 mapToObj
来处理行和 map
来处理每行中的元素来实现:
static int[][] add(int[][] a, int [][] b) {
return IntStream.range(0, a.length)
.mapToObj(i -> add(a[i], b[i])) // int[] is object
.toArray(int[][]::new); // create new 2D array
}
static int[] add(int[] a, int[] b) {
return IntStream.range(0, a.length)
.map(i -> a[i] + b[i]) // processing int operands
.toArray(); // IntStream.toArray() returns int[]
}
测试
int[][] a = {
{1, 2},
{3, 4}
};
int[][] b = {
{10, 20},
{30, 40}
};
System.out.println("Sum of a + b = ");
Arrays.stream(add(a, b))
.map(Arrays::toString)
.forEach(System.out::println);
输出
Sum of a + b =
[11, 22]
[33, 44]
Single-method实现可能如下:
static int[][] add2D(int[][] a, int [][] b) {
return IntStream
.range(0, a.length)
.mapToObj(i -> IntStream
.range(0, a[i].length)
.map(j -> a[i][j] + b[i][j])
.toArray()
)
.toArray(int[][]::new);
}
您可以使用Stream#reduce
方法对两个或多个二维数组的元素求和:
public static int[][] sumArrays(int[][]... arrays) {
// reduce the stream of arrays into a single
// array by sequentially summing array pairs
return Arrays.stream(arrays).reduce((a1, a2) -> IntStream
// iterate over the indices of
// the rows of the largest array
.range(0, Math.max(a1.length, a2.length))
.mapToObj(i -> IntStream
// iterate over the indices of
// the cells of the largest row
.range(0, Math.max(
i < a1.length ? a1[i].length : 0,
i < a2.length ? a2[i].length : 0))
// sum the elements of two rows if exist, or 0 otherwise
.map(j -> (i < a1.length && j < a1[i].length ? a1[i][j] : 0)
+ (i < a2.length && j < a2[i].length ? a2[i][j] : 0))
.toArray())
.toArray(int[][]::new))
.orElse(null);
}
// test
public static void main(String[] args) {
int[][] arr1 = {
{1},
{1, 1}};
int[][] arr2 = {
{2},
{2, 2},
{2, 2, 2}};
int[][] arr3 = {
{3, 3, 3, 3},
{3, 3, 3, 3},
{3, 3, 3, 3},
{3, 3, 3, 3}};
int[][] sum = sumArrays(arr1, arr2, arr3);
// output
Arrays.stream(sum).map(Arrays::toString).forEach(System.out::println);
//[6, 3, 3, 3]
//[6, 6, 3, 3]
//[5, 5, 5, 3]
//[3, 3, 3, 3]
}
另请参阅: