所以基本上我正在尝试读取包含以下内容的.txt文件:
3 5
2 3 4 5 10
4 5 2 3 7
-3 -1 0 1 5
并将它们存储到 2D 数组中并在控制台上打印,我从控制台得到的很好,但只缺少第一行 3 5,我不知道我的代码出了什么问题,让它忽略了第一行。我现在得到的输出:
2 3 4 5 10
4 5 2 3 7
-3 -1 0 1 5
import java.io.*;
import java.util.*;
public class Driver0 {
public static int[][] array;
public static int dimension1, dimension2;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Welcome to Project 0.");
System.out.println("What is the name of the data file? ");
String file = input.nextLine();
readFile(file);
}
public static void readFile(String file) {
try {
Scanner sc = new Scanner(new File(file));
dimension1 = sc.nextInt();
dimension2 = sc.nextInt();
array = new int[dimension1][dimension2];
while (sc.hasNext()) {
for (int row = 0; row < dimension1; row++) {
for (int column = 0; column < dimension2; column++) {
array[row][column] = sc.nextInt();
System.out.printf("%2d ", array[row][column]);
}
System.out.println();
}
}
sc.close();
}
catch (Exception e) {
System.out
.println("Error: file not found or insufficient requirements.");
}
}
}
您正在代码的这一部分中读取这些数字:
dimension1 = sc.nextInt();
dimension2 = sc.nextInt();
因此,dimension1
获取值 3,dimension2
获取值 5,但您没有将它们保存到数组中。
试试这个代码....
import java.io.*;
import javax.swing.*;
import java.util.*;
import java.awt.*;
public class Proj4 {
public static int rows, cols;
public static int[][] cells;
/**
* main reads the file and starts
* the graphical display
*/
public static void main(String[] args) throws IOException {
Scanner s = new Scanner(System.in);
String file = JOptionPane.showInputDialog(null, "Enter the input file name: ");
Scanner inFile = new Scanner(new File(file));
rows = Integer.parseInt(inFile.nextLine());
cols = Integer.parseInt(inFile.nextLine());
cells = new int[rows][cols];
//this is were I need help
for(int i=0; i < rows; i++)
{
String line = inFile.nextLine();
line = line.substring(0);
}
inFile.close();
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
System.out.print(cells[i][j]);
}
System.out.print();
}
您可以使用 Stream API 轻松完成此操作
public static Integer[][] readFile(String path) throws IOException {
return Files.lines(Paths.get(path)) // 1
.filter(line -> !line.trim().isEmpty()) // 2
.map(line -> Arrays.stream(line.split("[\s]+")) // 3
.map(Integer::parseInt) // 4
.toArray(Integer[]::new)) // 5
.toArray(Integer[][]::new); // 6
}
- 将文件读取为行流
- 忽略空行
- 用空格分隔每行
- 分析拆分的字符串值以获取整数值
- 创建整数值数组
- 将其收集在 2D 阵列中
前两个值被保存到 dimension1 和 dimension2 变量中,因此当稍后调用 sc.nextInt 时,它已经读取了前两个数字并移动到下一行。所以那些第一个整数不会进入数组。
需要考虑的几件事:
- 你想使用整个文件,所以我会用
Files.readAllLines()
一次阅读整个文件。 此函数返回一个List<String>
,其中包含文件的所有行。 如果有任何空行,请删除它们,现在您就有了要为 2d 数组声明的行数。 - 每行都是空格分隔的,因此
List<String>
中每行的简单String.split()
将为您提供每行应具有的列数。 - 拆分每行并将它们转换为整数可以使用嵌套的 for 循环来完成,这对于处理 2d 数组是正常的。
例如:
public static void main(String[] args) throws Exception {
// Read the entire file in
List<String> myFileLines = Files.readAllLines(Paths.get("MyFile.txt"));
// Remove any blank lines
for (int i = myFileLines.size() - 1; i >= 0; i--) {
if (myFileLines.get(i).isEmpty()) {
myFileLines.remove(i);
}
}
// Declare you 2d array with the amount of lines that were read from the file
int[][] intArray = new int[myFileLines.size()][];
// Iterate through each row to determine the number of columns
for (int i = 0; i < myFileLines.size(); i++) {
// Split the line by spaces
String[] splitLine = myFileLines.get(i).split("\s");
// Declare the number of columns in the row from the split
intArray[i] = new int[splitLine.length];
for (int j = 0; j < splitLine.length; j++) {
// Convert each String element to an integer
intArray[i][j] = Integer.parseInt(splitLine[j]);
}
}
// Print the integer array
for (int[] row : intArray) {
for (int col : row) {
System.out.printf("%5d ", col);
}
System.out.println();
}
}
结果:
3 5
2 3 4 5 10
4 5 2 3 7
-3 -1 0 1 5