【问题标题】:Finding a row sums of a 2D array查找二维数组的行和
【发布时间】:2021-01-20 12:50:29
【问题描述】:

我想求一个二维整数数组的第一行和第二行之和。这是我的代码,有什么办法可以缩短这段代码?

//creating 2D array for integers
int[][] num = {{1, 2, 3}, {4, 5, 6}};

int sum1 = 0;
int sum2 = 0;

//sum for first row
for (int a = 0; a == 0; a++) {
    for (int b = 0; b <= 2; b++) {
        sum1 += num[a][b];
    }
    System.out.println(sum1);
}

//sum for second row
for (int a = 1; a == 1; a++) {
    for (int b = 0; b <= 2; b++) {
        sum2 += num[a][b];
    }
    System.out.println(sum2);
}

输出是:

6
15

【问题讨论】:

    标签: java arrays multidimensional-array sum


    【解决方案1】:

    您可以使用流来获取二维数组的行和数组,如下所示:

    int[][] num = {{1, 2, 3}, {4, 5, 6}};
    
    int[] sum = Arrays.stream(num)
            .map(Arrays::stream)
            .mapToInt(IntStream::sum)
            .toArray();
    
    System.out.println(Arrays.toString(sum)); // [6, 15]
    

    【讨论】:

      【解决方案2】:

      是的,

      int[][] num = {{1, 2, 3}, {4, 5, 6}};
      
      int sum1 = 0;
      int sum2 = 0;
      
      //sum for first row and second row
      for (int a = 0; a <= 1; a++) {
          for (int b = 0; b <= 2; b++) {
              if (a == 0)
                  sum1 += num[a][b];
              else
                  sum2 += num[a][b];
          }
      }
      System.out.println(sum1); // 6
      System.out.println(sum2); // 15
      

      【讨论】:

        【解决方案3】:

        这可能会对您有所帮助:

        int[][] num = {{1, 2, 3}, {4, 5, 6}};
        
        for (int a = 0; a <= 1; a++) {
            int sum1 = 0;
            for (int b = 0; b <= 2; b++) {
                sum1 += num[a][b];
            }
            System.out.println(sum1);
        }
        

        【讨论】:

          【解决方案4】:

          你可以使用Streams API:

          import java.util.Arrays;
          import java.util.stream.IntStream;
          
          int[][] num = {
              { 1, 2, 3 },
              { 4, 5, 6 }
          };
          
          // sum of all elements in the 2D array
          int sum = Arrays.stream(num).mapToInt(a -> IntStream.of(a).sum()).sum();
          

          这将 2D 数组的所有元素相加。这样,即使您添加更多行或向每行添加更多元素,您的代码也会对整个网格求和。

          如果您需要单独计算每行的总和,请考虑:

          import java.util.stream.IntStream;
          
          int[][] num = {
              { 1, 2, 3 },
              { 4, 5, 6 }
          };
          
          // sum of the first row
          int sum1 = IntStream.of(num[0]).sum();
          
          // sum of the second row
          int sum2 = IntStream.of(num[1]).sum();
          

          【讨论】:

          • 但这会将整个二维数组的所有值相加,而不是像 OP 要求的那样逐行。
          • @maloomeister 是的,我在回答中指出了这一点。无论如何认为它可能会有所帮助。
          【解决方案5】:

          您可以将二维数组视为数组的数组。

          您可以简单地遍历“大数组”(让我们调用索引i),然后在i 位置获取数组并遍历他(让我们调用索引j)。

          现在您可以简单地将 [i][j] 上的值与 0 初始化变量的当前值相加(我们称之为 sum)。 在java中:

          int sum = 0;
          for (int i = 0; i < array.length; i++) {
              for (int j = 0; j < array[i].length; i++)
                  sum += array[i][j];
          }
          // Output: 21
          

          或者,如果您只想打印子数组总和,您可以打印总和并在第二个循环完成时对其进行初始化:

          int sum = 0;
          for (int i = 0; i < array.length; i++) {
              for (int j = 0; j < array[i].length; i++)
                  sum += array[i][j];
              System.out.println(sum);
              sum = 0;
          }
          // Output:
          // 6
          // 15
          

          【讨论】:

          • 谢谢你,现在我知道子数组是存在的。
          【解决方案6】:

          因为我们要遍历所有元素,就时间而言,O(n) 是最佳时间复杂度。

          int sum1 = 0;
          int sum2 = 0;
          
          //sum for first row
          for (int b = 0; b <= 2; b++) {
              sum1 += num[0][b];
          }
          System.out.println(sum1);
          
          //sum for second row
          for (int b = 0; b <= 2; b++) {
              sum2 += num[1][b];
          }
          System.out.println(sum2);
          

          【讨论】:

            【解决方案7】:
            • 两个实例中的外循环都是多余的,因为它基本上只作为变量声明和初始化处理。不需要这个循环,因为它只运行一次。

            • 您也不应该对循环使用固定大小,因为一旦您更改数组的大小,这将破坏您的代码。

            • 另外,我建议你使用一个数组来存储每一行​​的总和。

            所有建议的示例:

            public static void main(String[] args) {
                int[][] nums = {{1, 2, 3}, {4, 5, 6}};
                // hold the sum of each row in an array
                int[] sums = new int[nums.length];
                // loops shouldn't use fixed sizes, they
                // should run according to the arrays size
                for (int i = 0; i < nums.length; i++) {
                    for (int j = 0; j < nums[i].length; j++) {
                        // for each row, calculate the sum
                        // and store it in the sum array
                        sums[i] += nums[i][j];
                    }
                }
                System.out.println(Arrays.toString(sums));
            }
            

            输出:

            [6, 15]
            

            【讨论】:

              猜你喜欢
              • 2013-03-16
              • 2013-01-25
              • 2021-03-03
              • 1970-01-01
              • 1970-01-01
              • 2013-09-13
              • 2017-10-04
              • 2014-04-19
              • 1970-01-01
              相关资源
              最近更新 更多