为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕容3067478 2023-09-27 21:25:17
我是 API 流的新手,我想对 2D 数组进行一些操作以下代码是我想要做的事情的简化版本。我有一个值数组:int values[][] = new int[][] {{1,2},{3,4},{5,6}};我想处理每列的值并得到int result[] = {x,y}例如,如果我做一个求和,它应该让我result[] = {9, 12}预先感谢您的帮助
查看完整描述

3 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

尝试这个。


      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));

编辑:


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


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


      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;

            });


查看完整回答
反对 回复 2023-09-27
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

我的问题不够精确(抱歉我的英语水平很差)。


在第一个流示例中,它基于每行有 2 个值的事实。在我的 cas 中,我将始终具有相同数量的列,但我不知道编码时有多少列。


那么有了变量“size”,代码将如何修改?


int values[][] = new int[][] {

            {1,2,3},

            {4,5,6},

            {7,8,9}

    };


    int size = 3;

    int[] result2 = Arrays.stream(arr)

            .reduce(new int[size],

                    (a, b) -> new int[] { a[0] + b[0], a[1] + b[1] });

    System.out.println(Arrays.toString(result2));

我更关注代码的“a[0] + b[0]”部分


编辑:我终于得到了一些东西,但我想我可以不用for循环:


int values[][] = new int[][] {

            {1,2,3},

            {4,5,6},

            {7,8,9}

    };


    int size = 3;

    int[] result2 = Arrays.stream(values)

            .reduce(new int[size],

                    (a, b) -> {

                    int[] myInt = new int[size];

                    for (int i =0; i < size ; ++i) {

                        myInt[i] = a[i] + b[i];

                    }

                    return myInt;

            });

    System.out.println(Arrays.toString(result2));


查看完整回答
反对 回复 2023-09-27
?
12345678_0001

TA贡献1802条经验 获得超5个赞

这是 的一个很好的用例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}));


查看完整回答
反对 回复 2023-09-27
  • 3 回答
  • 0 关注
  • 97 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信