Java实现二维矩阵填充、文件读写及控制台打印问题修复
Java矩阵作业问题修复说明
存在的核心问题
- 打印存储int数组的ArrayList时,直接调用
Arrays.toString()处理Object数组,只会输出每个int数组对象的内存地址,无法输出数组内部实际数值 readMaze方法写死了列数为2,当用户输入的矩阵列数n不为2时,读取文件会出现逻辑错误- 额外可优化点:main方法中的
while(true)循环逻辑冗余,退出判断条件逻辑错误永远为真
修复步骤
1. 替换打印逻辑,补充文件读取后的空值统计
将原代码中:
ArrayList<int[]> list = readMaze("D:\\labs1.txt"); System.out.println(Arrays.toString(list.toArray()));
替换为:
// 调用readMaze时传入用户输入的列数n ArrayList<int[]> list = readMaze("D:\\labs1.txt", n); System.out.println("从文件读取到的矩阵内容:"); int readNullCount = 0; for (int[] row : list) { // 用Arrays.toString打印每一行的数值 System.out.println(Arrays.toString(row)); // 统计读取到的矩阵空值数量 for (int num : row) { if (num == 0) { readNullCount++; } } } System.out.println("读取文件后统计空值(0)数量:" + readNullCount);
2. 修改readMaze方法,支持动态传入列数
将原readMaze方法定义修改为:
// 新增width参数接收矩阵列数 public static ArrayList<int[]> readMaze(String fileName, int width) { // 删除原方法内写死的 int width = 2; 这行 // 其余原有逻辑保持不变 }
3. 移除冗余的while循环
删除main方法里的while (true) {和对应的结束大括号,以及错误的退出判断逻辑:
// 要删除的代码 if (k != 0 | k != 1) { break; }
修复后完整代码
package labs1; import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class labs2 { public static void main(String[] args) throws Exception { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.println("请输入矩阵尺寸m*n \n行数m ="); int m = Integer.parseInt(reader.readLine()); System.out.println("列数n ="); int n = Integer.parseInt(reader.readLine()); int[][] matrix = new int[m][n]; System.out.println("选择矩阵填充方式 \n0-手动填充 \n1-自动随机填充"); int k = Integer.parseInt(reader.readLine()); if (k == 0) { // 手动填充 for (int i = 0; i < m; i++) { System.out.println("请输入第" + (i+1) + "行的" + n + "个数字,每行输入一个:"); for (int j = 0; j < n; j++) { matrix[i][j] = Integer.parseInt(reader.readLine()); } } // 打印矩阵 System.out.println("填充后的矩阵:"); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { System.out.print(matrix[i][j] + " "); } System.out.println(); } //统计空值 int count = 0; for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[i].length; j++) if (matrix[i][j] == 0) { count++; } } System.out.println("矩阵中空值(0)数量:" + count); } else if (k == 1) { // 自动随机填充 for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[i].length; j++) { matrix[i][j] = ((int) (Math.random() * 10)); } } // 打印矩阵 System.out.println("随机生成的矩阵:"); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { System.out.print(matrix[i][j] + " "); } System.out.println(); } //统计空值 int count = 0; for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix[i].length; j++) if (matrix[i][j] == 0) { count++; } } System.out.println("矩阵中空值(0)数量:" + count); // 写入本地txt文件 StringBuilder sb = new StringBuilder(); for (int[] int1 : matrix) { for (int j = 0; j < int1.length; j++) { sb.append(int1[j]).append("\t"); } sb.append("\n"); } System.out.println("\n写入文件的矩阵内容:\n" + sb); Path path = Paths.get("D:\\labs1.txt"); Files.write(path, sb.toString().getBytes()); // 读取文件内容并打印、统计 ArrayList<int[]> list = readMaze("D:\\labs1.txt", n); System.out.println("从文件读取到的矩阵内容:"); int readNullCount = 0; for (int[] row : list) { System.out.println(Arrays.toString(row)); for (int num : row) { if (num == 0) { readNullCount++; } } } System.out.println("读取文件后统计空值(0)数量:" + readNullCount); } else { System.out.println("输入的填充方式不合法,程序退出"); } reader.close(); } // 读取文件方法 public static ArrayList<int[]> readMaze(String fileName, int width) { ArrayList<int[]> results = new ArrayList<>(); try { FileReader fileReader = new FileReader(fileName); BufferedReader bufferedReader = new BufferedReader(fileReader); Scanner mazeRunner = new Scanner(bufferedReader); while (mazeRunner.hasNextLine()) { int[] row = new int[width]; for (int i = 0; i < width; i++) { row[i] = mazeRunner.nextInt(); } results.add(row); if (mazeRunner.hasNextLine()) { mazeRunner.nextLine(); } } mazeRunner.close(); } catch (FileNotFoundException ex) { System.out.println("无法打开文件:" + fileName); } catch (IOException ex) { System.out.println("读取文件出错:" + fileName); } return results; } }
修复后运行效果示例
请输入矩阵尺寸m*n 行数m = 4 列数n = 2 选择矩阵填充方式 0-手动填充 1-自动随机填充 1 随机生成的矩阵: 1 0 9 3 6 3 0 2 矩阵中空值(0)数量:2 写入文件的矩阵内容: 1 0 9 3 6 3 0 2 从文件读取到的矩阵内容: [1, 0] [9, 3] [6, 3] [0, 2] 读取文件后统计空值(0)数量:2 Process finished with exit code 0
内容的提问来源于stack exchange,提问作者ecotalisman
相关产品推荐
相关产品推荐

