You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:36:01