数据结构之数组-备忘录

跳转到总目录


数组

稀疏数组

当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。

处理方法

记录数组一共有几行几列,有多少个不同的值.
把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模.
在这里插入图片描述
第一行来记录原先二维数组的几行几列,有多少个不同的值.
第二行开始记录原先数组中的所有值.
在这里插入图片描述


应用实例

使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等).
把稀疏数组存盘,并且可以从新恢复原来的二维数组数.
整体思路分析:
在这里插入图片描述


代码实现

//稀疏数组 场景:五子棋存盘退出和续上盘的功能
public class SparseArray {
    public static void main(String[] args) {
      //创建原始二维数组 11*11  0为空 1为黑棋 2为白棋
        int[][] chessArray = new int[11][11];
        chessArray[1][2]=1;
        chessArray[2][3]=1;
        chessArray[3][4]=2;
        chessArray[4][5]=2;
        //展示原始二维数组
        System.out.println("展示原始二维数组");
        show(chessArray);
        int count=0;
        for (int[] row : chessArray) {
            for (int data : row) {
                if (data!=0)
                    count+=1;
            }
        }
        int[][] chessSparseArray = new int[count + 1][3];
        chessSparseArray[0][0]=chessArray.length;
        chessSparseArray[0][1]=chessArray[1].length;
        chessSparseArray[0][2]=count;
        int sum=1;
        for (int i = 0; i < chessArray.length; i++) {
            for (int j = 0; j < chessArray[i].length; j++) {
                if (chessArray[i][j] != 0) {
                    chessSparseArray[sum][0] = i;
                    chessSparseArray[sum][1] = j;
                    chessSparseArray[sum][2] = chessArray[i][j];
                    sum+=1;
                }
            }
        }
        //展示稀疏数组
        System.out.println("展示稀疏数组");
        show(chessSparseArray);

        int[][] chessArrayAgain = new int[chessSparseArray[0][0]][chessSparseArray[0][1]];
        for (int i = 1; i <=  chessSparseArray[0][2]; i++) {
            chessArrayAgain[chessSparseArray[i][0]][chessSparseArray[i][1]]=chessSparseArray[i][2];
        }
        //展示恢复后的二维数组
        System.out.println("展示恢复后的二维数组");
        show(chessArrayAgain);
    }

    public static void show(int[][] chessArray) {
        for (int i = 0; i < chessArray.length; i++) {
            for (int j = 0; j < chessArray[i].length; j++) {
                System.out.printf("%d\t",chessArray[i][j]);
            }
            System.out.println();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值