读取包含2D阵列的不同尺寸的文件

时间:2017-03-13 00:56:17

标签: java file matrix java.util.scanner bufferedreader

我正在尝试阅读文本文件。文件是这样的:

  

第一行是网格数

     

第二行是m×n矩阵

     

然后我们有单元格的元素,然后它转到另一条线上的另一个m x n矩阵,然后是其元素,依此类推。

示例图片将进一步澄清我的描述。

现在我知道如何使用Scanner并阅读文件,但问题是我正在硬编码矩阵维度,因为我想要一个可以在任何文件上工作的算法。文件将只是维度将改变相同。

现在我的算法看起来像这样:

 Get the name of the file as command line argument
 then read the first line which is the number of grids to create
 then read the next line which states the dimension of the first grid
 then create a 2D array of that dimension. 
 Then read only lines up to the rows specified and load the data
 Then read the dimensions for the next grid and loop on till the end.

现在很容易得到算法,但我不知道如何将其转换为可行的代码。我可以使用Scanner,我也知道BufferedReader但我更喜欢Scanner,因为它包含更多功能。我的问题是我应该如何处理具有不同矩阵维度和网格数量的文件。

One example of a test file to read

2 个答案:

答案 0 :(得分:0)

首先,需要分离输入文件中的矩阵元素(即矩阵中的数字)。样本图像中的矩阵元素不会导致问题(例如,使用当前的输入文件格式方法,无法区分矩阵[111]和[111]。

您可以使用下面的 getArrayOfMatrices 方法实现您的算法;此方法将输入文件名作为参数,并返回矩阵的2D数组表示的数组。您可以访问(其中a表示方法返回的数组):
(1)具有a[0]的第一矩阵的2D阵列 (2)具有a[1]的第二矩阵的2D阵列 (3)具有a[0][0][0]的第一矩阵的(1,1) - 项 (4)具有a[0][0][1]的第一矩阵的(1,2) - 项 (5)具有a[0][1][0]的第一矩阵的(2,1) - 项 (6)具有a[0][1][1]的第一矩阵的(2,2) - 项 (7)具有a[1][0][0]的第二矩阵的(1,1) - 项 (8)具有a[1][0][1]的第二矩阵的(1,2) - 项 (9)具有a[1][1][0]的第二矩阵的(2,1) - 项 (10)具有a[1][1][1]的第二矩阵的(2,2) - 项 等。

对于使用此代码采用的方法,假设输入文件中的矩阵元素用空格分隔。

以下是可与 getArrayOfMatrices 方法一起使用的输入文件内容示例:
2
1 1
2
2 3
-1 0 1
3 30 300

以下是方法代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class ObtainmentOfArrayOfMatrices {

    public static int[][][] getArrayOfMatrices(String inputFileName)
    throws FileNotFoundException {
        Scanner scanner = new Scanner(new File(inputFileName));
        int numberOfMatrices = Integer.parseInt(scanner.nextLine());

        // An array that will contain all the 2D array representations of the
        // matrices.
        int[][][] arrayOfMatrices = new int[numberOfMatrices][][];

        int numberOfMatricesGoneOver = 0;
        while(numberOfMatricesGoneOver < numberOfMatrices) {

            // Create a 2D array representation of the current matrix and put
            // that representation in an array.

            String[] dimensions = scanner.nextLine().split(" ");
            int numberOfRows = Integer.parseInt(dimensions[0]);
            int numberOfColumns = Integer.parseInt(dimensions[1]);

            // A 2D array which represents the current matrix.
            int[][] currentMatrix = new int[numberOfRows][numberOfColumns];

            int numberOfRowsGoneOver = 0;
            while(numberOfRowsGoneOver < numberOfRows) {

                // An array that represents the current matrix row.
                int[] currentRow = new int[numberOfColumns];

                String[] elementsInCurrentRow = scanner.nextLine().split(" ");
                int numberOfColumnsGoneOverInCurrentRow = 0;

                // Insert the elements that are in the current matrix row.
                while(numberOfColumnsGoneOverInCurrentRow < numberOfColumns) {
                    currentRow[numberOfColumnsGoneOverInCurrentRow] = 
                    Integer.parseInt(elementsInCurrentRow
                    [numberOfColumnsGoneOverInCurrentRow]);
                    numberOfColumnsGoneOverInCurrentRow++;
                }

                // Insert the complete array representation of the current
                // matrix row.
                currentMatrix[numberOfRowsGoneOver] = currentRow;

                numberOfRowsGoneOver++;
            }

            // At this point, there's a complete 2D array representation of
            // the current matrix.

            arrayOfMatrices[numberOfMatricesGoneOver] = currentMatrix;
            numberOfMatricesGoneOver++;
        }
        scanner.close();
        return arrayOfMatrices;
    }
}

答案 1 :(得分:-1)

首先在程序开头声明一个矩阵:

int[][] matrix;
int n,m;
for each matrix on the file:
    read matrix dimensions to n and m
    matrix = new int[n][m]
    read values and put them on matrix

其他替代方案可以声明Vector<Vector<Integer>>,如所描述的here,或者有一个类代表this one这样的矩阵。