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

Java中普通矩阵转稀疏矩阵:转换后无法显示问题求助

问题排查与修复方案

核心问题分析

你遇到的稀疏矩阵无法显示的情况,主要由以下几个原因导致:

1. 稀疏矩阵判断条件过于严格

当前代码使用cnt < ((row * col) / 2)作为判断依据,但整数除法会导致边界判断失效:

  • 比如3×3的矩阵总元素数为9,(row*col)/2的结果是4(整数除法取整),若非零元素刚好是4,4 < 4不成立,无法触发显示逻辑。
  • 稀疏矩阵的定义通常是非零元素远少于总元素,而非严格小于一半,这个限制没必要。

2. 全零矩阵无处理逻辑

当矩阵全为0时,cnt=0,此时创建的稀疏矩阵数组长度为0,遍历循环直接跳过,导致无任何输出。

3. 输入缓冲区的冗余操作

main方法中choice = sc.nextInt();后的sc.nextLine();是多余的,虽然不会直接导致显示问题,但可能引发后续输入异常。


修复后的完整代码

import java.util.*;

public class SparseMatrix {

    static void enterMatrix(int matrix[][], Scanner sc) {
        for (int i = 0; i < matrix.length; ++i) {
            for (int j = 0; j < matrix[0].length; ++j) {
                matrix[i][j] = sc.nextInt();
            }
        }
    }

    static void displayMatrix(int[][] mat) {
        for (int i = 0; i < mat.length; i++) {
            for (int j = 0; j < mat[0].length; j++) {
                System.out.print("\t" + mat[i][j]);
            }
            System.out.println();
        }
    }

    static int checkSparseMatrix(int[][] mat) {
        int cnt = 0;
        for (int i = 0; i < mat.length; i++) {
            for (int j = 0; j < mat[0].length; j++) {
                if (mat[i][j] != 0)
                    cnt++;
            }
        }
        return cnt;
    }

    static void sparseMatrixDisplay(int[][] mat, int cnt) {
        // 处理全零矩阵情况
        if (cnt == 0) {
            System.out.println("矩阵中没有非零元素");
            return;
        }
        int Spmatrix[][] = new int[cnt][3];
        int k = 0;
        for (int i = 0; i < mat.length; i++) {
            for (int j = 0; j < mat[0].length; j++) {
                if (mat[i][j] != 0) {
                    Spmatrix[k][0] = i;
                    Spmatrix[k][1] = j;
                    Spmatrix[k][2] = mat[i][j];
                    k++;
                }
            }
        }
        // 优化显示格式,增加表头更清晰
        System.out.println("\n稀疏矩阵元素:");
        System.out.println("行\t列\t值");
        for (int i = 0; i < Spmatrix.length; i++) {
            System.out.println(Spmatrix[i][0] + "\t" + Spmatrix[i][1] + "\t" + Spmatrix[i][2]);
        }
    }

    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int choice;
        System.out.println("输入矩阵的行数和列数:");
        int row = sc.nextInt();
        int col = sc.nextInt();
        int mat[][] = new int[row][col];
        do {
            System.out.println("\n1. 输入矩阵");
            System.out.println("2. 显示矩阵");
            System.out.println("3. 显示稀疏矩阵");
            System.out.println("4. 退出");

            System.out.println("输入你的选择:");
            choice = sc.nextInt();

            switch (choice) {
                case 1:
                    System.out.println("输入矩阵元素:");
                    enterMatrix(mat, sc);
                    break;

                case 2:
                    System.out.println("输入的矩阵是:");
                    displayMatrix(mat);
                    break;

                case 3:
                    int cnt = checkSparseMatrix(mat);
                    System.out.println("非零元素数量:" + cnt);
                    // 调整判断逻辑,兼容边界情况,同时支持非稀疏矩阵的转换显示
                    if (cnt <= ((row * col) / 2)) {
                        System.out.println("该矩阵是稀疏矩阵");
                        sparseMatrixDisplay(mat, cnt);
                    } else {
                        System.out.println("该矩阵不是稀疏矩阵,但仍可转换为稀疏形式:");
                        sparseMatrixDisplay(mat, cnt);
                    }
                    break;

                case 4:
                    System.out.println("退出程序.....");
                    break;

                default:
                    System.out.println("请输入正确的选项");
                    break;
            }

        } while (choice != 4);

        sc.close();
    }
}

关键修复点说明

  1. 调整稀疏矩阵判断逻辑:将<改为<=解决整数除法的边界问题,同时增加非稀疏矩阵的转换显示选项,满足转换需求。
  2. 增加全零矩阵处理:在sparseMatrixDisplay方法开头判断非零元素数量,避免无输出情况。
  3. 删除冗余输入操作:移除sc.nextLine(),避免输入缓冲区异常。
  4. 优化显示格式:增加表头,让稀疏矩阵的输出更直观易读。

内容的提问来源于stack exchange,提问作者Nayan Pohane

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 00:57:03