将一个数组转换成稀疏数组并还原-java

package com.baidu.数组;

public class Demo08
{
    public static void main(String[] args)
    {
        int[][] array1 = new int[11][11];//定义一个11行11列且只有两个有效值的数组
        array1[1][2] = 1;
        array1[2][3] = 2;
        int sum1 = 0;//1.总行数-非机器语言之行数,即不是从零开始计数,而是从1开始;2.等于数组的长度
        int sum2 = 0;//1.总列数;2.用包含关系比较好理解长度的概念
        int count = 0;//有效值的总个数
        sum1 = array1.length;//从这一步开始统计数组的总行数、总列数、有效值的总个数
        System.out.println("array1数组:");
        for (int i = 0; i < array1.length; i++)
        {
            for (int j = 0; j < array1[i].length; j++)
            {
                System.out.print(array1[i][j]+"\t");//输出array1这个数组
                if(array1[i][j]!=0)
                {
                    count++;
                }
            }
            System.out.println();//第一轮循环完毕换行
            sum2 = array1[i].length;//1.sum2 是数组的总列数刚还是array1[i]的长度;2.只能放这里因为要用到for循环的变量i
        }

        System.out.println("\n"+"array1数组的总行数是:"+sum1);//实际是输出数组的总行数
        System.out.println("arrray1数组的有效值个数是:"+count);//输出数组有效值(非零值)的总数
        System.out.println("array1数组的总列数是:"+sum2);//实际是输出数组的总列数

        System.out.println("=============================="+"\n");//分隔符

        int[][] array2 = new int[count+1][3];//定义一个稀疏数组
        array2[0][0]=sum1;//第0行第0列的值是总行数
        array2[0][1]=sum2;//第0行第1列的值是总列数
        array2[0][2]=count;//第0行第2列的值是有效值的总个数
        int sum3 =0;//稀疏数组的行数
        System.out.println("将array1数组简写为稀疏数组arrray2:");
        for (int i = 0; i < array1.length; i++)//遍历array1这个数组
        {
            for (int j = 0; j < array1[i].length ; j++)
            {
                if(array1[i][j]!=0)//当array1数组的值为有效值时
                {
                    sum3++;
                    array2[sum3][0]=i;//将array1行数的值赋值给array2数组的第sum3行第零列
                    array2[sum3][1]=j;//将array1列数的值赋值给array2数组的第sum3行第1列
                    array2[sum3][2]=array1[i][j];//将array1的有效值赋值给第sum3行第2列
                }
            }
        }
        for (int i = 0; i < array2.length; i++)//遍历array2数组并输出数组
        {
            for (int j = 0; j < array2.length; j++)
            {
                System.out.print(array2[i][j]+"\t");//
            }
            System.out.println();//第一次循环完毕换行
        }

        System.out.println("==============================="+"\n");

        int array3[][] = new int[array2[0][0]][array2[0][1]] ;//还原的数组array3的行、列总数分别是array2第0行第零列和第1列的值

        for (int i = 1; i < array2.length; i++)//1.遍历数组array2;2.第0行的数已经取出,如果i从零开始会报错
        {
            for (int j = 0; j < array2[i].length; j++)
            {
                array3[array2[i][0]][array2[i][1]] = array2[i][2];
                //array3的行数是array2第i行第0列的值
                //array3的列数是array2第i行第1列的值
                //array3的有效值是array2第i行第2列的值
                //如果不明白建议多画几遍稀疏数组的排列图
                //稀疏数组总列数是固定的只有3列
                //稀疏数组第0行三个数值是固定的
                // 第0行第0列代表原始数组的总行数
                // 第0行第1列代表原始数组的总列数
                // 第0行第2列代表原始数组有效值的个数
            }
        }
        System.out.println("输出还原的数组array3:");
        for (int[] ints : array3)
        {
            for (int anInt : ints)
            {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
    }

}
//输出的所有结果如下:
/*
array1数组:
        0  0  0  0  0  0  0  0  0  0  0
        0  0  1  0  0  0  0  0  0  0  0
        0  0  0  2  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0

        array1数组的总行数是:11
        arrray1数组的有效值个数是:2
        array1数组的总列数是:11
        ==============================

        将array1数组简写为稀疏数组arrray2:
        11 11 2
        1  2  1
        2  3  2
        ===============================

        输出还原的数组array3:
        0  0  0  0  0  0  0  0  0  0  0
        0  0  1  0  0  0  0  0  0  0  0
        0  0  0  2  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0
        0  0  0  0  0  0  0  0  0  0  0  
*/




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值