稀疏数组

稀疏数组

package reck;

public class Demo07 {
    public static void main(String[] args) {
        int[][] arrays=new int[11][11];
        arrays[1][2]=1;
        arrays[2][3]=2;
        for (int i = 0; i < arrays.length; i++) {
            for (int j = 0; j < arrays[i].length; j++) {
                System.out.print(arrays[i][j]+"\t");

            }
            System.out.println();

        }
        //一,获取数组内有效值的个数
        int sum=0;//创建一个值用于存放有效值的个数
        for (int i = 0; i < arrays.length; i++) {
            for (int j = 0; j < arrays[i].length; j++) {
                /*写代码一定要严谨使用arrays.length也可以因为
                是11*11的二维数组但是如果是11*10呢?
                就会出现ArrayIndexOutOfBoundsException: 10越界错误
                 */
                if(arrays[i][j]!=0){
                    sum++;

                }
            }
        }
        System.out.println("数组内有效值的个数为:"+sum);
        System.out.println("=========================");
        //二,创建一个稀疏数组即一个二维数组
        /*
        sum+1为行因为第一行要表示:行数-列数-值的个数
        即多占了一行所以要sum+1
        3为列,第一行要表示:行数-列数-值的个数
              第 n 行要表示:横坐标-纵坐标-值
         */
        //1.创建一个稀疏数组
        int[][] arrays2=new int[sum+1][3];
        //2.给创建的稀疏数组赋第一行的值即:行数-列数-值的个数
        arrays2[0][0] = arrays.length;//第一行第一个数:行值
        arrays2[0][1] = arrays[0].length;//第一行第二个数:列值
        //因为数组中每个数组长度都一样所以可以找[0]代替
        arrays2[0][2] = sum;//第一行第三个数:有效数的个数
        //3.为有效值赋横,纵,值
        int num=0;//赋值储存数据
        for (int i = 0; i < arrays.length; i++) {
            for (int j = 0; j < arrays[i].length; j++) {
                if(arrays[i][j]!=0){
                    num++;//代表有效值在稀疏数组中的行数
                    arrays2[num][0]=i;//横坐标
                    arrays2[num][1]=j;//纵坐标
                    arrays2[num][2]=arrays[i][j];//数的值
                }

            }

        }
        //打印输出稀疏数组
        System.out.println("行"+"\t"+
                "列"+"\t"+
                "数"+"\t");
        for (int i = 0; i < arrays2.length; i++) {
            /*为什么不用嵌套循环输出
            因为嵌套的数组长度就3,用0,1,2就可以表示
            如果再次嵌套会使计算量增大
            写代码要注重代码的高效简洁
             */
            System.out.println(arrays2[i][0]+"\t"+
                    arrays2[i][1]+"\t"+
                    arrays2[i][2]+"\t");
        }
        System.out.println("======================");
        //三,将稀疏数组还原为原来的数组
        //1.创建一个二维数组用于存放稀疏数组的数据
        //存放稀疏数组中所表示的行数arrays2[0][0]和列数arrays2[0][1]
        int[][] arrays3= new int[arrays2[0][0]][arrays2[0][1]];
        //2.将稀疏数组中的有效值存入
        for (int i = 1; i < arrays2.length; i++) {
            /*
            注意这里i=1必须从1开始不能从0开始
            否则会报Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11
            越界错误
            原因:i=0从0开始为11行11列但是还原的数列虽然是11*11但是最大表示为10
                因为从0开始到10所以正好是11但是取不到11的值,所以会报错
             */

            arrays3[arrays2[i][0]][arrays2[i][1]]=arrays2[i][2];

        }
        //3.打印出原来的数组
        for (int i = 0; i < arrays3.length; i++) {
            for (int j = 0; j < arrays3[i].length; j++) {
                System.out.print(arrays3[i][j]+"\t");

            }
            System.out.println();

        }
        
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值