2

私は、ファイルを読み取ってコンテンツを2D配列に入力する必要があるプロジェクトに取り組んでいます。次に、各行、各列、およびマトリックスの周囲長を合計する必要があります。これまでのところ、境界を除いてすべてが機能しています。一番上の行、一番下の行、および2つの外側の列の中央に別々の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でなければなりません)。または、境界を見つけるための完全に優れた方法がある場合。前もって感謝します!

4

9 に答える 9

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);
于 2013-03-26T13:54:13.093 に答える
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

于 2013-03-26T14:14:06.847 に答える
2

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(...);
于 2013-03-31T13:22:09.530 に答える
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);
于 2013-03-26T13:51:50.280 に答える
1

これを行うだけです:

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

    System.out.print(sum);

これはあなたに合計を与えるはずです。

于 2017-01-21T04:31:54.700 に答える
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);
于 2013-03-26T14:25:38.673 に答える
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();
                            }

}


}
于 2017-08-07T09:00:36.877 に答える
0

あなたは単に使うことができます:

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

}

于 2019-08-31T19:56:55.360 に答える
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;
    }
于 2021-04-15T02:17:50.227 に答える