猿问

使用流获取二维数组中每列的结果

我是 API 流的新手,我想对 2D 数组进行一些操作

以下代码是我想要做的事情的简化版本。

我有一个值数组:

int values[][] = new int[][] {{1,2},{3,4},{5,6}};

我想处理每列的值并得到

int result[] = {x,y}

例如,如果我做一个求和,它应该让我

result[] = {9, 12}

预先感谢您的帮助


慕容3067478
浏览 111回答 3
3回答

qq_花开花谢_0

尝试这个。&nbsp; &nbsp; &nbsp; int values[][] = new int[][] { { 1, 2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, { 3, 4&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, { 5, 6&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; };&nbsp; &nbsp; &nbsp; int[] v = Arrays.stream(values).reduce(new int[] { 0, 0&nbsp; &nbsp; &nbsp; }, (a, b) ->&nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;a[0] += b[0];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;a[1] += b[1];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return a;&nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; System.out.println(Arrays.toString(v));编辑:关于您关于容纳不同数量的列的其他问题。是的,你可以做到。但仅仅因为你可以这样做并不意味着你应该这样做或者这是最好的方法。下面是一个简单的方法,可以对任何 2D 数组中的整数进行求和,而不管行长度如何。它甚至可以处理参差不齐的数组。请注意,这对列进行了总结,先到先得,因为它们被视为相对于彼此左对齐。初始化一个不规则(参差不齐或行长不同)的数组&nbsp; &nbsp; &nbsp; int values[][] = new int[][] { { 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, { 20, 3&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, { 1, 2, 4&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, { 3, 4, 10&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; };现在使用以下方法计算总和。&nbsp; &nbsp;public static int[] sumColumns(int[][] vals) {&nbsp; &nbsp; &nbsp; // compute the maximum row length (most columns)&nbsp; &nbsp; &nbsp; int maxColumns = 0;&nbsp; &nbsp; &nbsp; for (int r = 0; r < vals.length; r++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;maxColumns = Math.max(maxColumns, vals[r].length);&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; // use that to initialize the return array&nbsp; &nbsp; &nbsp; int[] sums = new int[maxColumns];&nbsp; &nbsp; &nbsp; //now just iterate over the rows and columns&nbsp; &nbsp; &nbsp; // calculating the sum.&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; for (int r = 0; r < vals.length; r++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for (int c = 0; c < vals[r].length; c++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sums[c] += vals[r][c];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; return sums;&nbsp; &nbsp;}要使用流创建任何矩形矩阵,请执行以下操作:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int[] result2 =&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Arrays.stream(values).reduce(new int[values[0].length], (a, b) ->&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for (int i = 0; i < values[0].length; ++i) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a[i] += b[i];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return a;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });

蓝山帝景

我的问题不够精确(抱歉我的英语水平很差)。在第一个流示例中,它基于每行有 2 个值的事实。在我的 cas 中,我将始终具有相同数量的列,但我不知道编码时有多少列。那么有了变量“size”,代码将如何修改?int values[][] = new int[][] {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {1,2,3},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {4,5,6},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {7,8,9}&nbsp; &nbsp; };&nbsp; &nbsp; int size = 3;&nbsp; &nbsp; int[] result2 = Arrays.stream(arr)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .reduce(new int[size],&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (a, b) -> new int[] { a[0] + b[0], a[1] + b[1] });&nbsp; &nbsp; System.out.println(Arrays.toString(result2));我更关注代码的“a[0] + b[0]”部分编辑:我终于得到了一些东西,但我想我可以不用for循环:int values[][] = new int[][] {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {1,2,3},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {4,5,6},&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {7,8,9}&nbsp; &nbsp; };&nbsp; &nbsp; int size = 3;&nbsp; &nbsp; int[] result2 = Arrays.stream(values)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .reduce(new int[size],&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (a, b) -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int[] myInt = new int[size];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int i =0; i < size ; ++i) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; myInt[i] = a[i] + b[i];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return myInt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; System.out.println(Arrays.toString(result2));

12345678_0001

这是 的一个很好的用例Collectors.teeing,但它仅在 Java 12 中可用。为了以防万一,下面是一个用法示例:int[] res =     Arrays.stream(values)         .collect(             Collectors.teeing(                 Collectors.summingInt(arr -> arr[0]),                 Collectors.summingInt(arr -> arr[1]),                 (a, b) -> new int[] {a, b}));
随时随地看视频慕课网APP

相关分类

Java
我要回答