二维数组转换为稀疏数组

二维数组转换为稀疏数组

在这里插入图片描述
在这里插入图片描述

/**
 * 二维数组转换稀疏数组的思路:
 * 1.遍历原始的二维数组,得到有效数据的个数sum(sum有多少个,稀疏数组就有sum+1行)
 * 2.根据sum的个数创建稀疏数组sparseArray int[sum + 1][3](列为固定值,行不确定)
 * 3.将二维数组的有效数据放入稀疏数组中
 * 0 0 0 1 0
 * 2 0 0 0 3
 * 0 5 0 0 0
 * 0 0 6 0 0
 * */
//创建一个原始的4行5列二维数组
        int[][] chessArray = new int[4][5];
        chessArray[0][3] = 1;
        chessArray[1][0] = 2;
        //chessArray[1][4] = 3;最后结果只有效值有5个,但是结果只输出四个这个3无法输出
        chessArray[2][1] = 5;
        chessArray[3][2] = 6;
        //遍历原始的二维数组,并记录值有几个
        for(int[] row : chessArray){
            for(int data : row){
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }
//计算有效值有几个
        //如果sum = 0 则会从0开始算结果为4,但是个数却还是有5个,所以这里就从1开始计数
        int sum = 0;
        for(int i = 0; i < chessArray.length; i++){
            for (int j = 0; j < chessArray.length; j++){
                if(chessArray[i][j] != 0){
                    sum++;
                }
            }
        }
        System.out.println("有效值的个数为:" + sum);
//将有效值放入稀疏数组中
        //创建稀疏数组
        int[][] sparseArray = new int[sum][3];
        /**
         * 向稀疏数组中添加固定数据(数组从0开始计算)
         * @auther [0][0] = 4 表示稀疏数组第一列为行数,行数为4
         * @auther [0][1] = 5 表示稀疏数组第二列为列数,列数为5
         * @auther [0][2] = sum 表示稀疏数组第三列为value,值为sum
         * */
        sparseArray[0][0] = 4;
        sparseArray[0][1] = 5;
        sparseArray[0][2] = sum;

        /**
         * @auther index 数组下标
         * */
        int index = 0;
        for(int i = 0; i < chessArray.length; i++){
            for(int j = 0; j < chessArray.length; j++){
                if(chessArray[i][j] != 0){
                    index++;
                    sparseArray[index][0] = i;
                    sparseArray[index][1] = j;
                    sparseArray[index][2] = chessArray[i][j];
                }
            }
        }
 //输出稀疏数组
        for(int i = 0; i < sparseArray.length; i++){
            System.out.printf("%d\t%d\t%d\t\n",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
        }
)

最后结果
在这里插入图片描述
这里存在一个问题,,把初始数组定义为一个一般数组时“2 0 0 0 0 3” 这一行中最后这3始终无法识别,有效值依然为5,但是稀疏数组中这3确实是没有,整体思路很清楚唯一就是这个小点无法解决,看了很多篇代码大家的都是差不多,通过修改代码重新测试后才发现稀疏数组只能将初始的二维数组定义为矩阵!!!
所以修改后的代码如下:

/**
 * 二维数组转换稀疏数组的思路:
 * 1.遍历原始的二维数组,得到有效数据的个数sum(sum有多少个,稀疏数组就有sum+1行)
 * 2.根据sum的个数创建稀疏数组sparseArray int[sum + 1][3](列为固定值,行不确定)
 * 3.将二维数组的有效数据放入稀疏数组中
 * 0 0 0 1 
 * 2 0 0 3
 * 0 5 0 0 
 * 0 0 6 0 
 * */
  //创建一个原始的4行4列二维数组
        int[][] chessArray = new int[4][4];
        chessArray[0][3] = 1;
        chessArray[1][0] = 2;
        chessArray[1][3] = 3;
        chessArray[2][1] = 5;
        chessArray[3][2] = 6;
        //遍历原始的二维数组,并记录值有几个
        for(int[] row : chessArray){
            for(int data : row){
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }

        System.out.println();

int sum = 0;
        for(int i = 0; i < chessArray.length; i++){
            for (int j = 0; j < chessArray.length; j++){
                if(chessArray[i][j] != 0){
                    sum++;
                }
            }
        }
        System.out.println("有效值的个数为:" + sum);
//将有效值放入稀疏数组中
        //创建稀疏数组
        int[][] sparseArray = new int[sum + 1][3];
        /**
         * 向稀疏数组中添加固定数据(数组从0开始计算)
         * @auther [0][0] = 4 表示稀疏数组第一列为行数,行数为4
         * @auther [0][1] = 4 表示稀疏数组第二列为列数,列数为4
         * @auther [0][2] = sum 表示稀疏数组第三列为value,值为sum
         * */
        sparseArray[0][0] = 4;
        sparseArray[0][1] = 4;
        sparseArray[0][2] = sum;

/**
         * @auther index 数组下标
         * */
        int index = 0;
        for(int i = 0; i < chessArray.length; i++){
            for(int j = 0; j < chessArray.length; j++){
                if(chessArray[i][j] != 0){
                    index++;
                    sparseArray[index][0] = i;
                    sparseArray[index][1] = j;
                    sparseArray[index][2] = chessArray[i][j];
                }
            }
        }

        //输出稀疏数组
        for(int i = 0; i < sparseArray.length; i++){
            System.out.printf("%d\t%d\t%d\t\n",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);
        }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值