2013-03-26 125 views
2

我正在研究一个项目,我必须读取一个文件并将内容输入到二维数组中。然后我必须对矩阵的每一行,每一列和周长进行求和。除了外围,我拥有的一切工作至今。我正尝试为两个外侧列的顶行,底行和中间创建单独的for循环。找到二维数组的总和java

矩阵文件看起来像这样:

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

    } 

我会hugeeeeeely感激,如果有人可以帮助我在第一列和最后一列的中间(应该是2 + 2和8 + 8)。或者如果你有一个更好的方式找到周边。提前致谢!

+0

你让一切都太复杂了。您不需要两个for循环来计算一个行/列。实际上,每次for循环只执行一次迭代。因此,如果您知道for循环只执行一次迭代,请修正该值并且不要用于循环 – Martinsos 2013-03-26 13:49:59

回答

2

我建议你这样说:

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

万一只有1行,你总结了两次来计算周长...不知道在这种情况下做什么,在我的答案中,我认为只用一个if来总结一次。 – LaGrandMere 2013-03-26 14:03:22

1
 //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); 
+0

如果您只处理一行时处理大小写,那么还应该处理只有一列的情况 – Martinsos 2013-03-26 14:26:01

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,3,2},{2,4,4,2},{3,6,6,3},{4,8 ,8,4}})); }

输出:42

0

感谢大家这么多!这样做更简单。 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); 
2

有一个la4j(线性代数为Java)库处理这个任务在0.4.0版本(在GitHub上目前可供选择:https://github.com/vkostyukov/la4j,将在Maven的这个夏天avaliable)。所以,这里是简单的例子:

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(...); 
1

只是这样做:

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

    System.out.print(sum); 

这应该给你的总和。

0

尝试以下操作:

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

} 


}