稀疏数组

实际需求:在写五子棋的程序中,有存盘退出和续上盘的功能

分析问题:因为该二维数组的很多值默认为0,因此记录了很多没有意义的数据->稀疏数组

思路分析

二维数组转稀疏数组

  1. 遍历原始的二维数组,得到有效数据的个数sum

  2. 根据sum就可以创建稀疏数组sparseArr int[sum+1] [3]

  3. 将二维数组的有效数据存入到稀疏数组

稀疏数组转原始的二维数组

  1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组

  2. 在读取稀疏数组后几行的数据,并赋给原始的二维数组即可

代码实现

  1. 首先创建一个二维数组

    // 创建一个原始的二维数组大小 11*11
    // 0: 表示没有棋子,1表示黑子,2表示白子
    int chessArr[][] = new int[11][11];
    chessArr[1][2] = 1;
    chessArr[2][3] = 2;
    chessArr[4][5] = 2;
    // 输出原始的二维数组
    System.out.println("原始的二维数组");
    for (int[] row : chessArr){
        for (int data : row){
            System.out.printf("%d\t",data );
        }
        System.out.println();
    }
  2. 将该二维数组按照我们所说的思路进行转换变成稀疏数组
    // 将二维数组转稀疏数组
    // 1.先遍历二维数组 得到非0数据的个数
    int sum = 0;
    for (int i = 0; i < chessArr.length; i++) {
        for (int j = 0; j < chessArr[0].length; j++) {
            if (chessArr[i][j]!=0){
                sum++;
            }
        }
    }
    // 2.创建对应的稀疏数组
    int sparseArr[][] = new int[sum+1][3];
    // 给稀疏数组赋值
    sparseArr[0][0] = 11;
    sparseArr[0][1] = 11;
    sparseArr[0][2] = sum;
    // 3.遍历二维数组,将非0的值存到稀疏数组中
    int count = 0;// count用于记录是第几个非0数据
    for (int i = 0; i < chessArr.length; i++) {
        for (int j = 0; j < chessArr[0].length; j++) {
            if (chessArr[i][j]!=0){
                count++;
                sparseArr[count][0]=i;
                sparseArr[count][1]=j;
                sparseArr[count][2]=chessArr[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\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
    }
    System.out.println();
  3. 将稀疏数组恢复为二维数组

    // 将稀疏数组-->恢复成二维数组
    //1.先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
    int chessArr1[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
    //2.在读取稀疏数组后几行的数据(从第二行开始),并赋给原始的二维数组即可
    for (int i = 1; i < sparseArr.length; i++) {
        chessArr1[sparseArr[i][0]][sparseArr[i][1]]=sparseArr[i][2];
    }
    // 输出恢复后的二维数组
    System.out.println();
    System.out.println("恢复后的二维数组");
    for (int[] row : chessArr1){
        for (int data : row){
            System.out.printf("%d\t",data );
        }
        System.out.println();
    }
物联沃分享整理
物联沃-IOTWORD物联网 » 解决稀疏数组的挑战

发表评论