0
点赞
收藏
分享

微信扫一扫

Java学习笔记:数据结构与算法之稀疏数组

伊人幽梦 2022-03-30 阅读 77
java

 

public class SparseArrayTest {
    public static void main(String[] args) {
        //创建一个充斥大量无效数据的二维数组,10行10列(前一个中括号表示行,后一个中括号表示列)
        int[][] array1=new int[10][10];
        //定义几个有效数据
        array1[3][3]=77;
        array1[4][4]=66;
        array1[5][3]=55;
        array1[6][2]=44;

        int count=0;//用于计算有效数据的个数
        //遍历二维数组
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                if(array1[i][j]!=0){//当第i行第j列的数据不是0的时候,既表示其为有效数据
                    count++;
                }
                System.out.print(array1[i][j]+" ");//将二维数组里的第一个数组,即第一行打印出来,包括无效数据
            }
            System.out.println();//每打印一行换一次行
        }
        /*-------------------------------------------------------------------------------------
                            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 77 0 0 0 0 0 0
                            0 0 0 0 66 0 0 0 0 0
                            0 0 0 55 0 0 0 0 0 0
                            0 0 44 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
        -----------------------------------------------------------------------------------------*/
        System.out.println("稀疏数组中有效值的个数是:"+count);//打印出count值
        System.out.println("--------------------------------------------------------------");//美丽分界线

        /*
        创建一个稀疏数组,也是一个二维数组;
        其中其固定三列,也就是二维数组中的每一个单数组只有三个元素;
        行数为有效数据的个数count+1;
        原数组中每一个有效数据都是一个数组;
         */
        int[][] sparseArray=new int[count+1][3];
        /*稀疏数组:
                            10 10 4
                            3 3 77
                            4 4 66
                            5 3 55
                            6 2 44
         */
        /*
        稀疏数组的第一行表示的是原数组的总体概况:
            第一列表示原数组共有几行;
            第二列表示原数组共有几列;
            第三列表示原数组共有几个有效数据;
         */
        sparseArray[0][0]=10;//第一行第一列
        sparseArray[0][1]=10;//第一行第二列
        sparseArray[0][2]=count;//第一行第三列
        int count1=0;//用于指向稀疏数组的行
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                if(array1[i][j]!=0){
                    count1++;//从稀疏数组的第一行开始添加数据
                    sparseArray[count1][0]=i;//稀疏数组的每一行的第一列为原数组有效数据所在的行
                    sparseArray[count1][1]=j;//稀疏数组的每一行的第二列为原数组有效数据所在的列
                    sparseArray[count1][2]=array1[i][j];//稀疏数组的每一行的第三列为原数组有效数据的具体值
                }
            }
        }
        //打印稀疏数组
        for (int i = 0; i < sparseArray.length; i++) {
            System.out.println(sparseArray[i][0]+" "+sparseArray[i][1]+" "+sparseArray[i][2]);
        }

        //稀疏数组复原
        /*
        创建一个新的二维数组,其中:
            新数组的行数是稀疏数组的第一行第一列的值;
            新数组的列数是稀疏数组的第一行第二列的值;
         */
        int[][] array2=new int[sparseArray[0][0]][sparseArray[0][1]];
        for (int i = 1; i < sparseArray.length; i++) {//遍历稀疏数组,从第二行也就是索引1开始
            /*
            把有效数据赋值到原数组的对应的具体元素上:
            从第二行开始:
                稀疏数组的每一行的第一列为原数据的所在行;
                稀疏数组的每一行的第二列为原数据的所在列;
                稀疏数组的每一行的第三列为原数据的值
             */
            array2[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2];
        }

        //打印复原数组
        for(int[] row:array2){
            for (int v:row){
                System.out.print(v+" ");
            }
            System.out.println();
        }
    }
}
举报

相关推荐

0 条评论