查找具有不同长度行的二维数组中的列的总和

时间:2015-04-25 04:37:19

标签: java arrays

所以我在使用不同长度的行返回二维数组中列的总和时遇到了一些问题。例如,2X2阵列可以很好地计算列的总和。但是,如果我有一个2X3阵列,它会给我一个越界错误。我希望它适用于用户为行和列提供的任何数字,而不仅仅是我所说的固定数字。有人可以帮我解决这个问题吗?非常感谢!

这是我的代码:

public static void columnSum(int[][]anArray) {
    int totalcol = 0;
    for(int col =0; col < anArray.length; col++){
        totalcol = 0;
        for(int row = 0; row < anArray[col].length; row++) {
            totalcol += anArray[row][col];
        }
    System.out.println("Sum of column " + col + " = " + totalcol);
    }  
}

3 个答案:

答案 0 :(得分:1)

你的指数被翻转了。您的for循环是为列主要排序而编写的,但您的累加器是针对行主要顺序编写的。你需要逆转其中一个。

答案 1 :(得分:0)

for循环中存在问题

    for(int row = 0; row < anArray[col].length; row++) {
        totalcol += anArray[row][col];
    }

如果数组是2X3,那么在使用col = 0然后anArray[col].length返回值3时,在此for循环中。因此,您的row变量在for中的值为0 - 2环。因此,当row的值为2且column的值为0时(如前所述),anArray[row][col]会抛出ArrayOutOfBoundException,因为anArray[2][0]不会存在。

所以试试这个:

    for(int row = 0; row < anArray.length; row++) {
        totalcol += anArray[row][col];
    }

我认为这会奏效。

答案 2 :(得分:0)

该问题未指定数组元素的order。有两种可能性:

  1. anArray[i][j]代表行i和列j(行主要)的元素
  2. anArray[i][j]代表i列和j行(列专业)的元素
  3. 要解决的更简单的任务是在列主数组中查找列总和,或者---完全等效地在行主数组中查找行和。问题中提议的解决方案只需要将totalcol += anArray[row][col]替换为totalcol += anArray[col][row],并且已经适用于此案例。

    计算行主数组中的列总和,或者---等效地 - 列主数组中的行总和有点困难。本答案的其余部分显示了如何计算行主数组的列总和。在这种情况下,anArray.length是行数,anArray[i].length是行i中的列数。

    在通常情况下,您的所有行都具有相同的列数,您可以这样做:

    int numrows = anArray.length;
    int numcols = (numrows > 0) ? anArray[0].length : 0; // Guard against 0x0 array
    
    for(int col = 0; col < numcols; col++) {
        int totalcol = 0;
        for(int row = 0; row < numrows; row++) {
            totalcol += anArray[row][col];
        }
        System.out.println("Sum of column " + col + " = " + totalcol);
    }
    

    如果您的行可能各自具有不同的列数(如问题标题所示),则需要:

    1. 确定何时没有要汇总的列。
    2. 计算列col的总和时,请确保跳过太短的行
    3. 一种方法是:

      int numrows = anArray.length;
      
      for(int col = 0; /* not known a priori*/; col++) {
          int totalcol = 0;
          boolean emptySum = true; // At first, assume no rows are long enough
          for(int row = 0; row < numrows; row++) {
              if(anArray[row].length <= col ) continue; // Skip short row
              emptySum = false; // Mark assumption as wrong
              totalcol += anArray[row][col];
          }
      
          // Exit the loop if we did not sum anything, i.e. no row had a column with index col
          if(emptySum) break;
      
          System.out.println("Sum of column " + col + " = " + totalcol);
      }
      

      您可以在初步传递中确定最大列长度,而不是使用笨拙的emptySum标志来退出循环:

      int numrows    = anArray.length;
      int maxnumcols = (numrows > 0) ? anArray[0].length : 0; // Guard against 0x0 array
      
      for(int row = 1; row < numrows; row++) {
          maxnumcols = Math.max(maxnumcols, anArray[row].length);
      }
      
      for(int col = 0; col < maxnumcols; col++) {
          int totalcol = 0;
          for(int row = 0; row < numrows; row++) {
              if(anArray[row].length <= col) continue; // Skip short row
              totalcol += anArray[row][col];
          }
          System.out.println("Sum of column " + col + " = " + totalcol);
      }
      

      最后,如果你被允许存储总和(而不是立即输出它们),这将是一个更清晰的解决方案(请注意迭代的行主要顺序,它非常适合数组的行主要顺序本身):

      int numrows    = anArray.length;
      int maxnumcols = (numrows > 0) ? anArray[0].length : 0; // Guard against 0x0 array
      
      for(int row = 1; row < numrows; row++) {
          maxnumcols = Math.max(maxnumcols, anArray[row].length);
      }
      
      int[] colsums = new int[maxnumcols]; // In Java, all elements are initialized to zero
      
      for(int row = 0; row < numrows; row++) {
          for(int col = 0; col < anArray[row].length; col++) {
              colsums[col] += anArray[row][col];
          }
      }
      
      for(int col = 0; col < colsums.length; col++) {
          System.out.println("Sum of column " + col + " = " + colsums[col]);
      }