2

I am working on a project where I have to read a file and enter the content into a 2D array. Then I have to sum each row, each column, and the perimeter of the matrix. I have everything working so far except the perimeter. I am trying to create separate for loops for the top row, bottom row, and middle of the two outside columns.

The matrix file looks like this:

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

Therefore the perimeter should add up to 42. Right now I can successfully add the first row and the last row to equal 22. However, when I add the columns to that total I get 32.

Here is the code:

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

   }

I would be hugeeeeeely appreciative if anyone could help me total the middle of the first and last column (should be 2+2 and 8+8). Or if you have an altogether better way of finding the perimeter. Thanks in advance!

jlordo
  • 37,490
  • 6
  • 58
  • 83
maggie
  • 49
  • 2
  • 2
  • 9
  • You made everything too complicated. You don't need two for loops to count just one row/column. Actually each time one of your for loops does only one iteration. So if you know that for loop is going to do just one iteration, fix that value and don't use for loop – Martinsos Mar 26 '13 at 13:49

9 Answers9

2

I reccomend you do it this way:

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);
Martinsos
  • 1,663
  • 15
  • 31
  • In case there is only 1 line, you sum it twice to calculate perimeter ... Not sure what to do in this case, in my answer I considered to sum it only once with a if. – LaGrandMere Mar 26 '13 at 14:03
2

Here is your method:

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

And here is your test with the array you provided :

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

Output : 42

javadev
  • 1,639
  • 2
  • 17
  • 35
2

There is a la4j (Linear Algebra for Java) library that handles this task in 0.4.0 release (currently avaliable at GitHub: https://github.com/vkostyukov/la4j, will be avaliable at Maven this summer). So, here is the brief example:

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: The next version of la4j (0.4.5) supports sum() method for matrices and vectors:

Matrix a = new Basic2DMatrix(...);
double s = a.sum(); // wrapper around a.fold(...);
Vladimir Kostyukov
  • 2,492
  • 3
  • 21
  • 30
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);
LaGrandMere
  • 10,265
  • 1
  • 33
  • 41
  • If you are handling case when there is just one row, then you should also handle case when there is just one column – Martinsos Mar 26 '13 at 14:26
1

Just do this:

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

    System.out.print(sum);

This should give you the sum.

C.Ikongo
  • 1,706
  • 1
  • 16
  • 15
0

thank you all so much! such a simpler way to do it. fyi: I ended up doing

    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);
maggie
  • 49
  • 2
  • 2
  • 9
0

Try the following:

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

}


}
marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
0

You can simply use:

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

}

0
    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;
    }
Gyden
  • 1