首页 > 解决方案 > 使用流获取二维数组中每列的结果

问题描述

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

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

我有一个值数组:

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

我想处理每列的值并得到

int result[] = {x,y}

例如,如果我做一个总和,它应该得到我

result[] = {9, 12}

提前感谢您的帮助

标签: javalambdajava-8java-stream

解决方案


尝试这个。

      int values[][] = new int[][] { { 1, 2
            }, { 3, 4
            }, { 5, 6
            }
      };
      int[] v = Arrays.stream(values).reduce(new int[] { 0, 0
      }, (a, b) ->
      {
         a[0] += b[0];
         a[1] += b[1];
         return a;
      });
      System.out.println(Arrays.toString(v));

编辑:

关于您关于容纳不同数量的列的其他问题。是的,你可以做到。但仅仅因为你可以并不意味着你应该或者这是最好的方式。下面是一个简单的方法,可以对任何二维数组中的整数求和,而不管行长如何。它甚至可以处理参差不齐的数组。请注意,这总结了列,先到先得,因为它们被视为相对于彼此左对齐。

初始化一个不规则(参差不齐或不同的行长)数组

      int values[][] = new int[][] { { 1
            }, { 20, 3
            }, { 1, 2, 4
            }, { 3, 4, 10
            }, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
            }
      };

现在使用以下方法计算总和。

   public static int[] sumColumns(int[][] vals) {
      // compute the maximum row length (most columns)
      int maxColumns = 0;
      for (int r = 0; r < vals.length; r++) {
         maxColumns = Math.max(maxColumns, vals[r].length);
      }

      // use that to initialize the return array
      int[] sums = new int[maxColumns];

      //now just iterate over the rows and columns
      // calculating the sum.  
      for (int r = 0; r < vals.length; r++) {
         for (int c = 0; c < vals[r].length; c++) {
            sums[c] += vals[r][c];
         }
      }
      return sums;
   }

要使用流做任何矩形矩阵,请执行以下操作:

           int[] result2 =
               Arrays.stream(values).reduce(new int[values[0].length], (a, b) ->
            {
               for (int i = 0; i < values[0].length; ++i) {
                  a[i] += b[i];
               }
               return a;
            });

推荐阅读