稀疏数组 sparsearray

什么是稀疏数组?
编写一个五子棋程序,有存盘退出的功能。
我们想到用二维数组来记录棋盘上各个点的棋子,但棋盘上不是每个点都有棋子,没有棋子的点在二维数组中会是默认值,如果棋盘上空子的地方很多,就会有很多无意义的数据
这个时候我们可以使用稀疏数组来进行压缩

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

处理方法是:
1) 记录数组一共有几行几列,有多少个不同的值
2) 把具有不同值的元素的行列值记录在一个小规模数组中,从而缩小程序的规模

实现稀疏数组:
实现一个稀疏数组,来保存上面的二维数组
把稀疏数组存盘,并且可以恢复原来的二维数组

public static void main(String[] args) {
    //初始化原始数组
    int chessArr[][] = new int[11][11];

    //原始数组的值
    chessArr[1][3] = 1;
    chessArr[4][2] = 2;

    //打印原始数组
    System.out.println("============chessArr=============");
    for(int i = 0;i < chessArr.length;i++) {
        for(int j = 0;j < chessArr[i].length;j++) {
            System.out.printf("%d\t", chessArr[i][j]);
        }
        System.out.println();
    }

    //循环原始数组,判断有多少个不为默认0的数
    int diffSum = 0;
    for(int i = 0;i < chessArr.length;i++) {
        for(int j = 0;j < chessArr[i].length;j++) {
            if(chessArr[i][j] != 0) {
                diffSum++;
            }
        }
    }

    //根据上面的结果创建稀疏数组
    int sparseArr[][] = new int[diffSum+1][3];
    //循环原始数组,将不为默认值的行、列、值 记录到稀疏数组
    sparseArr[0][0] = chessArr.length;
    sparseArr[0][1] = chessArr[0].length;
    sparseArr[0][2] = diffSum;
    int row = 1;
    for(int i = 1;i < chessArr.length;i++) {
        for(int j = 0;j < chessArr[i].length;j++) {
            if(chessArr[i][j] != 0) {
                sparseArr[row][0] = i;
                sparseArr[row][1] = j;
                sparseArr[row][2] = chessArr[i][j];
                row++;
            }
        }
    }

    //打印稀疏数组
    System.out.println("============sparseArr=============");
    for(int i = 0;i < sparseArr.length;i++) {
        for(int j = 0;j < sparseArr[i].length;j++) {
            System.out.printf("%d\t", sparseArr[i][j]);
        }
        System.out.println();
    }

    //记录棋盘到文件
    ObjectOutputStream oos = null;
    try {
        oos = new ObjectOutputStream(new FileOutputStream(new File("E://map.data")));
        oos.writeObject(sparseArr);
        oos.flush();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (oos != null) {
                oos.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //反序列化
    int sparseArrFromFile[][] = new int[0][];
    ObjectInputStream ois = null;
    try {
        ois = new ObjectInputStream(new FileInputStream(new File("E://map.data")));
        sparseArrFromFile = (int[][]) ois.readObject();
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    } finally {
        try {
            if (ois != null) {
                ois.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //打印反序列化的稀疏数组
    System.out.println("============sparseArrFromFile=============");
    for(int i = 0; i < sparseArrFromFile.length; i++) {
        for(int j = 0;j < sparseArrFromFile[i].length;j++) {
            System.out.printf("%d\t", sparseArrFromFile[i][j]);
        }
        System.out.println();
    }

    //从稀疏数组恢复原始数组 并打印
    int originalArr[][] = new int[sparseArrFromFile[0][0]][sparseArrFromFile[0][1]];
    for(int i = 1; i < sparseArrFromFile.length; i++) {
        originalArr[sparseArrFromFile[i][0]][sparseArrFromFile[i][1]] = sparseArrFromFile[i][2];
    }
    System.out.println("============originalArr=============");
    for(int i = 0;i < originalArr.length;i++) {
        for(int j = 0;j < originalArr[i].length;j++) {
            System.out.printf("%d\t", originalArr[i][j]);
        }
        System.out.println();
    }
}


============chessArr=============
0	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	0	0	0	0	0	0	0	
0	0	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	
============sparseArr=============
11	11	2	
1	3	1	
4	2	2	
============sparseArrFromFile=============
11	11	2	
1	3	1	
4	2	2	
============originalArr=============
0	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	0	0	0	0	0	0	0	
0	0	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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值