稀疏数组转化二维数组

public class Sparse {
/**
* 稀疏数组 在一个大型矩阵中,根据坐标去找值,当一个值出现的次数过多时,那个值就是无意义的。
* 稀疏数组的存储方式(从0开始)
* 行 列 值
* [0] 第一行是总行数 第一行是总列数 第一行是总共出现的值
* [1] 1 2 36 (第一行第二列的所储存的值是36)
*/

public static void main(String[] args) {
    int[][] arrays=new int[9][9];//第一个代表的是行,第二个代表的是列,就像是规定了长度
    arrays[2][3]=1;//赋值,第二行第三列的值是1
    arrays[3][3]=3;//赋值,第三行第三列的值是3
    //输出原始的数组
    System.out.println("输出原始的数组");

    for(int[] ints:arrays){//第一次for循环相当于是行数
        for(int anInt:ints){//第二次for循环相当于是列数
            System.out.print(anInt+"\t");//输出值
        }
        System.out.println();
    }
    System.out.println("=============");

    //转化为稀疏数组保存
    //获取有效值的个数
    //判断是否有值
    int sum=0;//临时变量,计数用的
    for (int i=0;i<9;i++){//遍历行数
        for(int j=0;j<9;j++){//遍历列数
            if(arrays[i][j]!=0){//判断这个位置的坐标是不是0,不是0进入判断
                sum++;//个数加1
            }
        }
    }

    System.out.println("有效值的个数"+sum);

    //2.创建一个稀疏数组的数组
    int[][] array2=new int[sum+1][3];//稀疏数组定义长度,动态初始化,是长度。行数因为第一行显示的是总行数,所以从第二位开始,所以要加1,第二个[]长度是3,下标就额是012
    array2[0][0]=9;//第一行,总行数
    array2[0][1]=9;//第一行,总列数
    array2[0][2]=sum;//总共有多少个值

    //遍历二维数组,将非零的值,存放稀疏数组中
    int count=0;//临时数组
    for(int i=0;i<arrays.length;i++){//遍历行数
        for(int j=0;j<arrays[i].length;j++){//遍历列数
            if(arrays[i][j]!=0){//如果行列不是0,进入判断
                count++;//count+1
                array2[count][0]=i;//行数
                array2[count][1]=j;//列数
                array2[count][2]=arrays[i][j];//arrays[i][j]代表着数组的坐标
            }
        }
    }
    System.out.println("稀疏数组");
    for(int i=0;i<array2.length;i++){//正常遍历条件
        System.out.println(array2[i][0]+"\t"+array2[i][1]+"\t"+array2[i][2]+"\t");
    }

    System.out.println("======还原======");
    //1.读取稀疏数组
    int[][] array3=new int[array2[0][0]][array2[0][1]];//动态初始化长度,new int[][]里面就是上面已经定义好的。可以看成 int[][] array3=new int[9][9];

    //2.給其中的元素还原它的值
    //array2的数组是   9   9   2   这是首行,不用读取,直接从第一行开始读取所以 i=1

    System.out.println(array2.length+"!!!");
    for(int i=1;i<array2.length;i++){//第0行是头部信息,不用读取
        //array3[][]定位,查找稀疏数组的 行 列 并将值赋給 array3[][]
        array3[array2[i][0]] [array2[i][1]]= array2[i][2];

    }

    //3.打印数组
    System.out.println("输出还原的数组");

    for(int[] ints:array3){//第一次for循环相当于是行数
        for(int anInt:ints){//第二次for循环相当于是列数
            System.out.print(anInt+"\t");//输出值
        }
        System.out.println();
    }
    System.out.println("=============");

}

}

posted @ 2020-12-29 10:09  啥也不懂的三水  阅读(58)  评论(0编辑  收藏  举报