找到二维数组java的总和

我正在开发一个项目,我必须读取文件并将内容输入到2D数组中。 然后我必须对每行,每列和矩阵的周长求和。 到目前为止,除了周边外,我还有一切工作。 我正在尝试为两个外部列的顶行,底行和中间创建单独的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),我将非常感激。 或者,如果你有一个更好的方法来寻找外围。 提前致谢!

我建议你这样做:

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

这是你的方法:

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

这是您使用所提供arrays的测试:

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

产量:42

有一个la4j (线性代数for Java)库在0.4.0版本中处理这个任务(目前可以在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(...); 
  //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); 

这样做:

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

这应该给你总和。

非常感谢你们! 这样一种简单的方法。 fyi:我最终做了

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

请尝试以下方法:

 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