我正在尝试阅读文本文件。文件是这样的:
第一行是网格数
第二行是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
,因为它包含更多功能。我的问题是我应该如何处理具有不同矩阵维度和网格数量的文件。
答案 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)