java 求二维整数数组的前几个元素的和

khbbv19g  于 2023-02-28  发布在  Java
关注(0)|答案(4)|浏览(197)

有一个整型二维数组:

int[][] arr = {{3, 4},{5, 6, 7},{10, -4, 7}};

我想求第一个元素的和:int sum = 3+5+10;
我可以写:

int sum = 0;
for (final int[] i : arr)
    sum += i[0];

但是我想不使用传统的 for 循环来求和。
我试过减少:

Arrays.stream(arr).reduce(0, (a, b) -> a[0] + b[0])

但这并不奏效。

jdg4fx2g

jdg4fx2g1#

试试这个。

import java.util.*;
import java.util.stream.*;

public class Main
{
    public static void main(String[] args) {
        int[][] arr = {{3, 4},{5, 6, 7},{10, -4, 7}};
        
        int x = Arrays.stream(arr).map(vec -> vec[0]).reduce(0, Integer::sum);
        
        System.out.println(x);
    }
}

物流(arr):获取数组的数组并返回数组的数组流。
.map(vec -〉vec[0]):取括号中的lambda并对流中的每个元素执行它,将结果Map到输出流中(它是一个适配器)。在这个特定的lambda中,我们取数组并输出第一个元素。
.reduce(0,整数::和):它是流的最终消费者(也称为收集器)。接受一个收集器函数(在本例中为sum),以便流中的所有元素都被收集到一个从值0(第一个参数)开始的求和变量中。

frebpwbc

frebpwbc2#

这里的问题是:

Arrays.stream(arr).reduce(0, (a, b) -> a[0] + b[0])

reduceMap器接受一个二维数组,并期望返回一个数组,但您返回的是一个int。
所以另一个解决方法是这样的:

Arrays.stream(arr).mapToInt(a -> a[0]).sum()

首先,我将int ArrayMap为int(数组的第一个元素),然后使用该流的和。
您可以查看Oracle提供的有关流API的免费教程:https://dev.java/learn/the-stream-api/

k3fezbri

k3fezbri3#

正如我在注解中解释的,由于0[0]无效,因此将0作为a的初始值传递是无效的,因此您的代码是错误的。
你可以这样做:
Arrays.stream(arr).reduce(new int[] {0}, (a, b) -> new int[]{a[0] + b[0] })[0];
它将二维数组缩减为具有一个表示总和的元素的一维数组,然后打印其第一个元素。

jhdbpxl9

jhdbpxl94#

首先,因为有不同大小的子数组,所以需要确保索引为0的元素存在,这意味着该数组不为空,否则可能会得到ArrayIndexOutOfBoundsException
其次,这里不需要使用reduce
在Stream API中,我们有几种专门的归约形式,获取 primitive stream 元素的sum的操作被表示为sum()操作(当然,可以使用reduce()来实现,但这会使代码变得不必要的冗长和缺乏表达力)。
另外,请注意,在将每个子数组的第一个元素相加时,可能会遇到 * 整数溢出 *。为了避免这种情况,如果对输入没有明确的约束,则可以求助于LongStream

int[][] arr = {{3, 4},{5, 6, 7},{10, -4, 7}};

long sum = Arrays.stream(arr)
    .filter(a -> a.length > 0)
    .mapToLong(a -> a[0])
    .sum();

相关问题