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(); } }
关键修复点说明
- 调整稀疏矩阵判断逻辑:将
<改为<=解决整数除法的边界问题,同时增加非稀疏矩阵的转换显示选项,满足转换需求。 - 增加全零矩阵处理:在
sparseMatrixDisplay方法开头判断非零元素数量,避免无输出情况。 - 删除冗余输入操作:移除
sc.nextLine(),避免输入缓冲区异常。 - 优化显示格式:增加表头,让稀疏矩阵的输出更直观易读。
内容的提问来源于stack exchange,提问作者Nayan Pohane
相关产品推荐
相关产品推荐

