了解稀疏数组

稀疏数组(一种数据结构)

了解稀疏数组_第1张图片
了解稀疏数组_第2张图片

package com.mypackage.array;

public class Demo08 {
    public static void main(String[] args) {
        //1.创建一个二维数组  11*11
        // 0:没有棋子   1:黑棋  2:白棋
        int[][] array1 = new int[11][11];
        array1[1][2] = 1;
        array1[2][3] = 2;
        //一、输出原始的数组
        System.out.println("输出原始数组:");

        printArray2(array1);


        System.out.println("=============================");


        //二、转换为稀疏数组来保存
        //1.先获取有效值的个数
        int sum = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (array1[i][j] != 0){
                    sum++;
                }
            }
        }
        System.out.println("有效值的个数:"+sum);

        //2.再创建一个稀疏数组
        int[][] array2= new int[sum+1][3];
        array2[0][0] = 11;
        array2[0][1] = 11;
        array2[0][2] = sum;

        //3.遍历二维数组,将非零的值放进稀疏数组中
        int count = 0;
        for (int i = 0; i < array1.length; i++) {
            for (int j = 0; j < array1[i].length; j++) {
                if (array1[i][j] != 0){
                    count ++;
                    array2[count][0] = i;
                    array2[count][1] = j;
                    array2[count][2] = array1[i][j];
                }
            }
        }

        //4.输出稀疏数组
        System.out.println("输出稀疏数组:");

        printArray2(array2);


        System.out.println("=================");


        //三、将稀疏数组还原
        System.out.println("还原稀疏数组:");
        //1.先读取稀疏数组
        int[][] array3= new int[array2[0][0]][array2[0][1]];
        //2.给其中的元素还原它的值
        for (int i = 1; i < array2.length; i++) {
            array3[array2[i][0]][array2[i][1]] = array2[i][2];
        }
        //3.打印
        System.out.println("输出还原的数组:");

        printArray2(array3);
    }


    public static void printArray2(int[][] array){
        for (int[] ints : array) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
    }
}

//输出
输出原始数组:
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	
=============================
有效值的个数:2
输出稀疏数组:
11	11	2	
1	2	1	
2	3	2	
=================
还原稀疏数组:
输出还原的数组:
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

(心得分析)详细讲解一下代码如下:

package com.mypackage.array;

public class Demo08 {
    public static void main(String[] args) {
        //1.创建一个二维数组  11*11
        // 0:没有棋子   1:黑棋  2:白棋
        int[][] array1 = new int[11][11];
        array1[1][2] = 1;
        array1[2][3] = 2;
        //一、输出原始的数组
        System.out.println("输出原始数组:");

        printArray2(array1);


        System.out.println("=============================");


        //二、转换为稀疏数组来保存
        //1.先获取有效值的个数
        int sum = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (array1[i][j] != 0){
                    sum++;
                }
            }
        }
        System.out.println("有效值的个数:"+sum);

        //2.再写出稀疏数组的第0行
        int[][] array2= new int[sum+1][3];
        array2[0][0] = 11;
        array2[0][1] = 11;
        array2[0][2] = sum;

        //3.遍历二维数组,将非零的值放进稀疏数组中,写出稀疏数组第0行以下的数
        /*二维数组的第一个括号代表行数,也就是竖着的长度;
        第二个括号代表列数,也就是横着的长度
        array.length代表的是二维数组的行数
        array[i].length才是代表它的列数*/
        int count = 0;
        for (int i = 0; i < array1.length; i++) {
            for (int j = 0; j < array1[i].length; j++) {
                if (array1[i][j] != 0){
                    count ++;
                    array2[count][0] = i;
                    array2[count][1] = j;
                    array2[count][2] = array1[i][j];
                }
            }
        }
        /*原数组如下:
        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的数,count++。
        比如:在第1行第2列中也就是i=1、j=2时就遇到了第一个不为0的数,
        那么此时count++变成1,稀疏数组的第1行的每个数就有了着落,
        稀疏数组的第1行第0列,也就是array2[1][0],它的值就是原数组的行数,也就是1;
        稀疏数组的第1行第1列,也就是array2[1][1],它的值就是原数组的列数,也就是2;
        稀疏数组的第1行第2列,也就是array2[1][2],它的值就是原数组的此位置的值,也就是1。
        */
        /*依次类推,得出稀疏数组如下:
                            11	11	2
                            1	2	1
                            2	3	2
        */

        //4.输出稀疏数组
        System.out.println("输出稀疏数组:");

        printArray2(array2);


        System.out.println("=================");


        //三、将稀疏数组还原
        System.out.println("还原稀疏数组:");
        //1.先读取稀疏数组
        int[][] array3= new int[array2[0][0]][array2[0][1]];
        /*
        array[0][0]就是原数组的行数,array[0][1]就是原数组的列数。
        这一步读取稀疏数组,可以将原数组的长宽读取回来
        */
        //2.给其中的元素还原它的值
        for (int i = 1; i < array2.length; i++) {
            array3[array2[i][0]][array2[i][1]] = array2[i][2];
        }
        /*
        int i = 1,把i初始化为1,是因为稀疏数组的第1行开始才是有效值,
        稀疏数组的第0行是行数列数以及有效值个数。
        以上面的稀疏数组为例:
                            11	11	2
                            1	2	1
                            2	3	2
        */
        /*
        i = 1时,array3[array[1][0]][array2[1][1]] = array2[1][2];
        也就是,array3[1][2] = 1;
        同样的,array3[2][3] = 2;
        这样,原数组的两个有效值就被填充回去了,
        我们只需要吧有效值的位置填充一下就行,
        剩下的位置直接默认被0填充满。
        */
        //3.打印
        System.out.println("输出还原的数组:");

        printArray2(array3);
    }

    //创建一个用来打印数组的方法,节省代码量
    public static void printArray2(int[][] array){
        for (int[] ints : array) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
    }
}

你可能感兴趣的:(狂神说Java系列笔记,java)