java数据结构(1) 稀疏数组sparsearray

java数据结构(1) 稀疏数组sparsearray

此博客为学习笔记,学习尚硅谷java数据结构课程后所撰写的笔记。

1. 需求案例

1.1 保存棋盘信息至文件

[外链图片转存失败(img-XKc0KPdZ-1565092673531)(D:\markdowm笔记软件\images\java数据结构\棋盘.jpg)]

假如把白棋设为1,黑棋设为2,空棋设为0,将棋盘看作一个二维数组。

当棋子数较少时,0很多,使用二维数组保存数据到文件中,会保留大量无用的0 (这是没什么意义的数据)

2. 稀疏数组简介

2.1 使用方法

记录数组行列数以及多少个不同的值

将行,列,值三个元素记录在一个小规模数组中

2.2 使用场景

当一个数组中大部分元素为同一个值时,使用稀疏数组保存该数组。

3.稀疏数组代码实例

3.1实例

…去了趟4399,玩了把五子棋。

在这里插入图片描述

使用稀疏数组保存如图所示棋盘信息 棋盘14*14 假如把白棋设为1,黑棋设为2,空棋设为0

3.2 代码实现

跟多细节性的东西,都写在了注释里面:

这是完整源码,可直接编译运行

package sparsearray;

/**
 * 稀疏数组
 * 保存棋盘信息
 * 棋盘15*15 白棋设为1,黑棋设为2,空棋设为0
 */
public class sparsearraytest {
    //private static int chessboardInfor[][]=new int[15][15];

    public static void main(String[] args) {
        int chessboardInfor[][] = new int[15][15];
        //白棋为1
        chessboardInfor[6][4] = 1;
        chessboardInfor[7][9] = 1;
        chessboardInfor[8][7] = 1;
        chessboardInfor[8][9] = 1;
        //黑棋为2
        chessboardInfor[5][6] = 2;
        chessboardInfor[6][7] = 2;
        chessboardInfor[7][7] = 2;
        chessboardInfor[7][8] = 2;
        chessboardInfor[8][8] = 2;
        //空棋为0(int 数组默认为0)

        //输出普通数组的存储结果
        System.out.println("普通数组存储结果");
        for (int[] row : chessboardInfor) {
            for (int data : row) {
                System.out.print(" " + data);
            }
            //换行
            System.out.println();
        }

        //不用稀疏数组的话就直接将该数组存储到文件了,此步骤省略
        //问题是存放了大量的无用数据0,浪费了存储空间


        /**
         * 将上边二维数组 转换为 稀疏数组
         * 1.遍历数组记录非0个数
         * 2.创建对应的稀疏数组
         * 3.将原数组非0元素赋值给稀疏数组
         * 4.打印稀疏数组中的值
         */

        //1 遍历数组 记录非0个数
        int number = 0;
        for (int i = 0; i < 14; i++) {
            for (int j = 0; j < 14; j++) {
                if (chessboardInfor[i][j] != 0)
                    number++;//记录非0个数
            }
        }
        System.out.println("非0个数" + number);

        //2 创建对应的稀疏数组
        int sparsearray[][] = new int[number + 1][3];
        //在数组首部存储 行 列 非0个数,这三个参数
        sparsearray[0][0] = 15;
        sparsearray[0][1] = 15;
        sparsearray[0][2] = number;

        //3.将原数组非0元素赋值给稀疏数组
        int count = 0;//记录到达了第几个非0数
        for (int i = 0; i < 15; i++) {
            for (int j = 0; j < 15; j++) {
                if (chessboardInfor[i][j] != 0) {
                    count++;//到达了第 count++ 个非0数
                    //将 行,列,非零数值 存放近稀疏数组
                    sparsearray[count][0] = i;
                    sparsearray[count][1] = j;
                    sparsearray[count][2] = chessboardInfor[i][j];
                }
            }
        }

        //4.打印稀疏数组中的值
        System.out.println("稀疏数组的存储结果");
        for (int i = 0; i < sparsearray.length; i++) {
            System.out.println(sparsearray[i][0] + " "
                    + sparsearray[i][1] + " "
                    + sparsearray[i][2]);
        }



        /**
         *  已知稀疏数组 转换为 普通二维数组
         * 1.读取第一行,获取行数和列数,并创建二维数组
         * sparsearray[0][0]:总行数
         * sparsearray[0][1]:总列数
         * sparsearray[0][2]:非0数的个数
         * 假设 在稀疏数组中下标为k(k>0),原始二维数组中元素(i,j)值为2,则sparsearray[k][0]=i sparsearray[k][1]=j sparsearray[k][2]=2
         *
         * 2.读取后面的值 并按照行列数 赋值给二维数组即可
         */

        //1.读取第一行,获取行数和列数,并创建二维数组
        int chessboardInfor2[][] =new int [sparsearray[0][0]][sparsearray[0][1]];

        //2.读取后面的值 并按照行列数 赋值给二维数组即可
        //i从1开始遍历,因为下标0位置是存储总行数,总列数,和非0元素个数的地方
        for (int i=1;i<sparsearray.length;i++){
            chessboardInfor2[sparsearray[i][0]][sparsearray[i][1]]=sparsearray[i][2];
        }

        //输出稀疏数组 转换为 普通二维数组的存储结果
        System.out.println("稀疏数组 转换为 普通二维数组的存储结果");
        for (int[] row : chessboardInfor2) {
            for (int data : row) {
                System.out.print(" " + data);
            }
            //换行
            System.out.println();
        }
        
    }
}

3.3 运行结果

运行结果:

运行效果

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值