【问题标题】:finding sum of two dimensional array java查找二维数组java的总和
【发布时间】:2013-03-16 08:03:33
【问题描述】:

我正在做一个项目,我必须读取文件并将内容输入到二维数组中。然后我必须对矩阵的每一行、每一列和周长求和。到目前为止,除了外围之外,我已经完成了所有工作。我正在尝试为顶行、底行和两个外部列的中间创建单独的 for 循环。

矩阵文件如下所示:

1 2 3 4 
2 4 6 8 
2 4 6 8 
3 2 3 4 

因此周长加起来应该是 42。 现在我可以成功地将第一行和最后一行添加到等于 22。但是,当我将列添加到总数中时,我得到 32。

代码如下:

import java.util.*; // Scanner class
import java.io.*;  // File class

public class Lab10
{
   static public void main( String [ ] args )  throws Exception
   {    
  if ( args.length != 1 )
  {
    System.out.println("Error -- usage is:  java Lab10 matdataN.txt");
    System.exit( 0 );
  }

    //Requirement #1: first int value: # of rows, second int value: # of cols
    File newFile = new File(args[0]); 
    Scanner in = new Scanner(newFile);

    int numRows = in.nextInt();
    int numCols = in.nextInt();

    //Requirement #2: declare two-d array of ints
    int[][] matrix;
    matrix = new int[numRows][numCols];

    //Requirement #3 & 4: read file one line at a time (nested for loops 
        //and nextInt()) and print

    for (int i = 0; i < numRows; i++)
    {
        for (int j = 0; j < numCols; j++)
        {
            matrix[i][j] = in.nextInt();
            System.out.print(matrix[i][j]+ " ");
        }
    System.out.println();
    }

    //Requirement #5: traverse each row and sum the values and display the sums
    int rowTotal = 0;
    for (int i = 0; i < numRows; i++)
    {
        rowTotal = 0;
        for (int j = 0; j < numCols; j++)
        {
            rowTotal += matrix[i][j];
        }
    System.out.println("Sum for row = " + rowTotal);
    }

    //Requirement #6: traverse each column and sum the values and display the sums
    int colTotal = 0;
    for (int i = 0; i < numRows; i++)
    {
        colTotal = 0;
        for (int j = 0; j < numCols; j++)
        {
            colTotal += matrix[j][i];
        }
    System.out.println("Sum for col = " + colTotal);
    }

    //Requirement #7: traverse the perimeter and sum the values and display the sum

    //sum bottom row matrix
    int perTotal = 0;
    for (int i = (numRows-1); i < numRows; i++)
    {
        perTotal = 0;
        for (int j = 0; j < numCols; j++)
        {
            perTotal += matrix[i][j];
        }
    }

    //sum + top row matrix
    for (int i = 0; i < numRows - (numRows-1); i++)
    {
        for (int j = 0; j < numCols; j++)
        {
            perTotal += matrix[i][j];
        }
    System.out.println("Sum of perimeter = " + perTotal);
    }

    // sum + first col middle
    for (int i = 1; i < (numRows-1); i++)
    {
        for (int j = 0; j < numCols - (numCols-1); j++)
        {
            perTotal += matrix[j][i];
        }
    System.out.println("Sum = " + perTotal);
    }

    // sum + last col middle
    for (int i = 1; i < (numRows-1); i++)
    {
        for (int j = (numCols-1); j < numCols; j++)
        {
            perTotal += matrix[j][i];
        }
    System.out.println(perTotal);
    }

   }

如果有人可以帮助我计算第一列和最后一列的中间值(应该是 2+2 和 8+8),我将不胜感激。或者,如果您有更好的方法来找到周长。提前致谢!

【问题讨论】:

  • 你把一切都弄得太复杂了。您不需要两个 for 循环来仅计算一行/列。实际上,每次您的 for 循环之一只进行一次迭代。因此,如果您知道 for 循环只会进行一次迭代,请修复该值并且不要使用 for 循环

标签: java matrix multidimensional-array


【解决方案1】:

我建议你这样做:

int perTotal = 0;
// top and bottom row
for (int c = 0; c < numCols; c++)
    perTotal += matrix[0][c] + matrix[numRows-1][c];
// left and right column
for (int r = 1; r < numRows-1; r++)
    perTotal += matrix[r][0] + matrix[r][numCols-1];

// output
System.out.println("Perimeter=" + perTotal);

【讨论】:

  • 如果只有 1 条线,则将其相加两次以计算周长...不知道在这种情况下该怎么做,在我的回答中,我认为只用 if 求和一次。
【解决方案2】:

这是你的方法:

public static int perimeter(int[][] array) {
    int perimter = 0;
    for (int i = 0; i < array[0].length; i++) {
        perimter += array[0][i] + array[array.length - 1][i];
    }
    for (int r = 1; r < array.length - 1; r++) {
        perimter += array[r][0] + array[r][array[0].length - 1];
    }
    return perimter;
}

这是您使用您提供的数组进行的测试:

public static void main(String[] args) { System.out.println(perimeter(new int[][]{{1, 2, 2, 3}, {2, 4, 4, 2}, {3, 6, 6, 3}, {4, 8, 8, 4}})); }

输出:42

【讨论】:

    【解决方案3】:

    在 0.4.0 版本中有一个 la4j(Java 的线性代数)库来处理这个任务(目前在 GitHub 上可用:https://github.com/vkostyukov/la4j,今年夏天将在 Maven 上可用)。所以,这里是一个简短的例子:

    Matrix a = new Basic2DMatrix(...); // creates a real matrix
    
    // calculates the sum of '1' row
    double d1 = a.foldRow(1, Matrices.asSumAccumulator(0)); 
    // calculates the sum of '2' 
    double d2 = a.foldColumn(2, Matrices.asSumAccumulator(0));
    
    // the helper class that fetches border elements of matrix
    class PerimeterFetcher implements MatrixFunction {
    
      private int rows;
      private int columns;
    
      public PerimeterFectcher(int rows, int columns) {
        this.rows = rows;
        this.columns = columns;
      }      
    
      @Override
      public double evaluate(int i, int j, double value) {
        return i == 0 ? value : j == 0 ? value : (i + 1) == rows ? value
               : (j + 1) == columns ? value : 0;
      }
    }
    
    // calculates the perimeter of matrix
    double p = a.fold(Matrices.asSumFunctionAccumulator(0, 
                      new PerimeterFetcher(a.rows(), a.columns())));     
    

    UPD:下一个版本的 la4j (0.4.5) 支持矩阵和向量的sum() 方法:

    Matrix a = new Basic2DMatrix(...);
    double s = a.sum(); // wrapper around a.fold(...);
    

    【讨论】:

      【解决方案4】:
              //Requirement #7: traverse the perimeter and sum the values and display the sum
      
              int perTotal = 0;
      
              // First line
              for (int j = 0; j < numCols; j++)
              {
                  perTotal += matrix[0][j];
              }
      
              // If there is only one line, then it is done.
              if (numRows > 1)
              {
                  // Last line
                  for (int j = 0; j < numCols; j++)
                  {
                      perTotal += matrix[numRows-1][j];
                  }
      
                  // Other lines
                  for (int i = 1; i < numRows -1); i++)
                  {
                      perTotal += matrix[i][0] + matrix[i][numcols -1];
                  }
              }
      
          //Perimeter
          System.out.println("Perimter="+perTotal);
      

      【讨论】:

      • 如果你处理只有一行的情况,那么你也应该处理只有一列的情况
      【解决方案5】:

      这样做:

              for (int i = 0; i < ROWS; i++){
                 for (int j = 0; j < COLUMNS; j++){
                   sum = sum + myArray[i][j];
              }
          }
      
          System.out.print(sum);
      

      这应该给你总和。

      【讨论】:

        【解决方案6】:

        非常感谢大家!这种更简单的方法。仅供参考:我最终做了

            int perTotal = 0;
            for (int i = 0; i < numCols; i++)
            {
                perTotal += matrix[0][i] + matrix[numRows-1][i];
            }
            for (int j = 1; j < numRows-1; j++)
            {
                perTotal += matrix[j][0] + matrix[j][numCols-1];
            }
            System.out.println("Perimeter = " + perTotal);
        

        【讨论】:

          【解决方案7】:

          尝试以下方法:

          import java.util.Scanner;
          public class TwoDarray {
          
          public static void main(String[] args) 
          {
              Scanner scn=new Scanner(System.in);
          
              System.out.print("Enter the first Rows of Array :");    //Input first Rows and Columns
              int row1 = scn.nextInt();
              System.out.print("Enter the first columns of Array:");
              int col1 = scn.nextInt();
              System.out.print("Enter the second Rows of Array :");   //Input second rows and column
              int row2 = scn.nextInt();
              System.out.print("Enter the second columns of Array:");
              int col2 = scn.nextInt();
          
              int arr1[][] = new int[row1][col1];                     // Input the elements in first row and column
          
                      System.out.println("Enter the elements in First row and column");
                          for(int i=0;i<row1;i++)
                          {
                              for(int j=0;j<col1;j++)
                              {
                                  arr1[i][j]=scn.nextInt();
                              }
                          }
          
              int arr2[][] = new int[row2][col2];                     // Input the elements in second row and column
          
                  System.out.println("Enter the elements in second row and column");
                      for(int i=0;i<row2;i++)
                      {
                          for(int j=0;j<col2;j++)
                          {
                              arr2[i][j]=scn.nextInt();
                          }
          
                      }
          
              System.out.println("Output of first row and column is ");       //output of first row and column
                  for(int i=0;i<row1;i++)
                  {
                      for(int j=0;j<col1;j++)
                      {
                          System.out.print(arr1[i][j]+" ");
                      }   System.out.println();
                  }
          
                          System.out.println("output of secound row and column");         //out put of second row and column
                              for(int i=0;i<row2;i++)
                              {
                                  for(int j=0;j<col2;j++)
                                  {
                                      System.out.print(arr2[i][j]+" ");
                                  }       System.out.println();
                              }
          
          
                                                                  //sum of first and second row and column
          
                              int sum[][] = new int[row1][col1];
                                  for(int i=0;i<row1;i++)
                                  {
                                      for(int j=0;j<col1;j++)
                                      {
                                          sum[i][j]=arr1[i][j]+arr2[i][j];
                                      }
                                  }
          
                                  System.out.println("sum of two matrix output");         //sum of two matrix output
                                      for(int i=0;i<row1;i++)
                                      {
                                          for(int j=0;j<col1;j++)
                                          {
                                              System.out.print(sum[i][j]+" ");
                                          }       System.out.println();
                                      }
          
          }
          
          
          }
          

          【讨论】:

            【解决方案8】:

            你可以简单地使用:

            static int sumMultiArray(int[][] array) {
            int sum = 0;
            for (int[] ints : array) {
                for (int number : ints) {
                    sum += number;
                }
            }
            return sum;
            

            }

            【讨论】:

              【解决方案9】:
                  private static int sumElementInArray(int[][] arrayWithElement) {
                      int sum = 0;
                      for (int i = 0; i < arrayWithElement.length; i++) {
                          sum += IntStream.of(arrayWithElement[i]).sum();
                      }
                      return sum;
                  }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2013-09-13
                • 2022-01-02
                • 1970-01-01
                • 2015-12-13
                • 1970-01-01
                • 2013-03-06
                • 1970-01-01
                相关资源
                最近更新 更多