[Java数据结构][1] 稀疏数组的Java代码实现案例

来自尚硅谷Java数据结构的课程笔记

  • 当遇见一个数组中有许多默认的重复数字时候,如棋盘,地图,可以用稀疏数组存储,节省存储空间
  • 掌握数组到稀疏数组
  • 掌握稀疏数组返回原数组

案例
[Java数据结构][1] 稀疏数组的Java代码实现案例_第1张图片
可以看到以稀疏数组存储有效的节省了空间,接下来我们来实现代码。
第0行表示六行七列,八个有效数字

代码

创建数组,初始化并输出

 // 创建原始二维数组
        int chessArr1[][] = new int[11][11];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
        // 初始化原始的二维数组
        for (int[] row : chessArr1) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println("");//控制换行
        }

我们得到一个11*11的数组
小知识点

  1. printf可以格式化输出
  2. for( : )可以根据内容遍历
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数据个数,据此创建一个 sum行,3列的数组。

 // 遍历二维数组的到非0数据的个数
        int sum = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (chessArr1[i][j] != 0){
                    sum++;
                }
            }
        }

        // 创建对应的稀疏数组
        int[][] sparseArr = new int[sum + 1][3];
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = 11;

遍历二维数组,非0的值存放到稀疏数组中,随后输出稀疏数组

// 遍历二维数组,非0的值存放到稀疏数组中
        int count = 0; //用于记录是第几个非零数据
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (chessArr1[i][j] != 0) {
                    count++;
                    // 为稀疏列表添加值
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr1[i][j];
                }
            }

        }
        // 输出稀疏数组的形式
        System.out.println();
        System.out.println("得到的稀疏数组为");
        for(int i = 0; i < sparseArr.length ; i++){
            System.out.printf("%d\t%d\t%d\t",sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
            System.out.println("");
        }

得到稀疏数组,第一行是原数组信息

得到的稀疏数组为
11	11	11	
1	2	1	
2	3	2	

最后是恢复过程

System.out.println("*******************************");
        // 稀疏数组恢复
        int[][]  chessArr2= new int[sparseArr[0][0]][sparseArr[0][1]];

        for(int i = 1; i < sparseArr.length;i++){
            chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }

        // 恢复后的二维数组
        for (int[] row : chessArr2) {
            for( int data : row){
                System.out.printf("%d\t",data);
            }
            System.out.println("");
        }

完整代码

public class SparseArray {
    public static void main(String[] args) {
        // 创建原始二维数组
        int chessArr1[][] = new int[11][11];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
        // 初始化原始的二维数组
        for (int[] row : chessArr1) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println("");//控制换行
        }
        // 遍历二维数组的到非0数据的个数
        int sum = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (chessArr1[i][j] != 0){
                    sum++;
                }
            }
        }

        // 创建对应的稀疏数组
        int[][] sparseArr = new int[sum + 1][3];
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = 11;

        // 遍历二维数组,非0的值存放到稀疏数组中
        int count = 0; //用于记录是第几个非零数据
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (chessArr1[i][j] != 0) {
                    count++;
                    // 为稀疏列表添加值
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr1[i][j];
                }
            }

        }
        // 输出稀疏数组的形式
        System.out.println();
        System.out.println("得到的稀疏数组为");
        for(int i = 0; i < sparseArr.length ; i++){
            System.out.printf("%d\t%d\t%d\t",sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
            System.out.println("");
        }
        System.out.println("*******************************");
        // 稀疏数组恢复
        int[][]  chessArr2= new int[sparseArr[0][0]][sparseArr[0][1]];

        for(int i = 1; i < sparseArr.length;i++){
            chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }

        // 恢复后的二维数组
        for (int[] row : chessArr2) {
            for( int data : row){
                System.out.printf("%d\t",data);
            }
            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	

得到的稀疏数组为
11	11	11	
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	

你可能感兴趣的:(JAVA,数据结构,数据结构,java)