java实现稀疏数组 -- 棋盘案例

稀疏数组应用场景

棋盘案例

在这里插入图片描述

问:如何将这一盘棋的信息记录下来

思路

我们将黑棋位置记为1,白棋位置记为2,其他空白位置记为0;
即:

0 0 0 0 0 0 0
0 0 1 0 2 0 0
0 0 1 0 2 0 0
0 0 0 0 2 0 0
0 0 0 0 0 0 0

这样,这一盘棋的信息就体现出来了,在Java中我们可以通过二维数组将此保存进内存中

代码实现

package com.atguigu.linklist;

public class sparseArrayTest {
    public static void main(String[] args) {
        //使用二维数组保存此棋盘数据
        int[][] array = new int[5][6];//棋盘数组  第一个数据表示有几列 第二个数据表示一行有几个数据
        //将每一行数据存入数组里
        array[0] = new int[]{0,0,0,0,0,0,0};
        array[1] = new int[]{0,0,1,0,2,0,0};
        array[2] = new int[]{0,0,1,0,2,0,0};
        array[3] = new int[]{0,0,0,0,2,0,0};
        array[4] = new int[]{0,0,0,0,0,0,0};
        //将二维数组输出
        for (int row = 0; row <= 4; row++) {
            //行
            for (int col = 0; col <= 6; col++) {
                //列
                //输出
                System.out.printf(array[row][col] + "\t");//
            }
            System.out.println("\n");
        }
    }
}

输出结果

0	0	0	0	0	0	0	

0	0	1	0	2	0	0	

0	0	1	0	2	0	0	

0	0	0	0	2	0	0	

0	0	0	0	0	0	0	

利用二维数组存储棋盘所引发的思考

从二维数组输出的结果可以看出,无效数据‘ 0 ’占用空间多 从而影响程序执行的效率
因此 我们引入一个新的概念 ---- 稀疏数组

稀疏数组

何为稀疏数组

5 7 5
1 2 1
1 4 2
2 2 1
2 4 2
3 4 2

以上就是由上面的二维数组转换而来的稀疏数组,看到这也许你会疑惑,这个稀疏数组是依据什么思想转换而来的呢?

思路
第一行 5 7 5
5:记录了二维数组一共有几行
7:记录了二维数组一共有几列
5:记录了二维数组中有效数据(非0数据)一共有几个
其他行:
第一个数字表示该有效数据所在行
第二个数字表示该有效数据所在列
第三个数字表示该位置所存储的数据

代码实现 二维数组 =》 稀疏数组

public class sparseArrayTest {
    public static void main(String[] args) {
        /*
        *   0 0 0 0 0 0 0
            0 0 1 0 2 0 0
            0 0 1 0 2 0 0
            0 0 0 0 2 0 0
            0 0 0 0 0 0 0
        * */
        //使用二维数组保存此棋盘数据
        int[][] array = new int[5][6];//棋盘数组  第一个数据表示有几列 第二个数据表示一行有几个数据
        //将每一行数据存入数组里
        array[0] = new int[]{0,0,0,0,0,0,0};
        array[1] = new int[]{0,0,1,0,2,0,0};
        array[2] = new int[]{0,0,1,0,2,0,0};
        array[3] = new int[]{0,0,0,0,2,0,0};
        array[4] = new int[]{0,0,0,0,0,0,0};
        
        sparseUtil sparseUtil = new sparseUtil();//稀疏数组工具类
        int[][] sparseArray = sparseUtil.doubleArrayToSparseArray(array);//生成的稀疏数组
        //将稀疏数组输出
        for (int row = 0; row < sparseArray.length; row++) {
            //行
            for (int col = 0; col < sparseArray[row].length; col++) {
                //列
                //输出
                System.out.printf(sparseArray[row][col] + "\t");//
            }
            System.out.println("\n");
        }
    }
}

class sparseUtil{//关于稀疏数组的工具类
    //二维数组 =》 稀疏数组
    //传入一个二维数组
    public int[][] doubleArrayToSparseArray(int[][] doubleArray){
        //获取此二维数组各维度长度
        int row = doubleArray.length;
        int col = doubleArray[0].length;
        //遍历 获取此数组的有效数据
        int count = 0;//有效数据的个数
        for (int i = 0; i <= 4; i++) {
            //列
            for (int j = 0; j <= 6; j++) {
                //行
                //有效数据
                int value = doubleArray[i][j];
                if (value!=0){
                    count++;
                }
            }
        }
        //稀疏数组第一行数据
        int[] oneRow = {row,col,count};

        //新建一个稀疏数组
        int[][] sparseArray = new int[count+1][3];//第一个数据表示有几列 第二个数据表示一行有几个数据
        //将第一行的数据加入进去
        sparseArray[0] = oneRow;
        //循环 得到有效数据后 获取行和列存入稀疏数组
        int index = 1;//加入稀疏数组时 需要的指针 用来确定在稀疏数组中的第几行 从1开始
        for (int i = 0; i <= 4; i++) {
            //行
            for (int j = 0; j <= 6; j++) {
                //列
                //有效数据
                int value = doubleArray[i][j];
                if (value!=0){
                    int thisRow = i;//表示该所在行
                    int thisCol = j;//表示该所在列
                    //存入稀疏数组
                    sparseArray[index] = new int[]{thisRow,thisCol,value};
                    index++;//指针后移
                }
            }
        }
        return sparseArray;//最后将稀疏数组返回
    }
}

输出结果

5	7	6	

1	2	1	

1	4	2	

2	2	1	

2	4	2	

3	4	2	

4	2	2	

如何将一个稀疏数组转化为二维数组

思路:先拿到首行数据 获取二维数组长度信息 创建二维数组,获取有效数据的个数 确定循环次数 先将数组的数据全部初始化为0 然后遍历稀疏数组 获取哪行那列对应的哪个数据 然后将数据填入响应的位置

代码实现

//传入稀疏数组 将其转化为  二维数组
    public int[][] sparseArrayToDoubleArray(int[][] sparseArray){
        //先获取稀疏数组头行数据
        int[] header = sparseArray[0];
        int row = header[1];//二维数组行数
        int col = header[0];//二维数组列数
        int count = header[2];//有效数据个数
        int[][] doubleArray = new int[col][row];//将二维数组创建

        //填充其为0
        for (int i = 0; i < col; i++) {
            for (int j = 0; j < row; j++) {
                doubleArray[i][j] = 0;
            }
        }

        //遍历稀疏数组 获取有效数据及位置信息 并填充
        for (int i = 1; i < sparseArray.length; i++) {
            //从第二行开始
            int rowLocal = sparseArray[i][0];//行位置
            int colLocal = sparseArray[i][1];//列位置
            int value = sparseArray[i][2];//值

            //存入二维数组
            doubleArray[rowLocal][colLocal] = value;
        }
        return  doubleArray;
    }

稀疏数组代码集合

package com.atguigu.linklist;

import com.atguigu.sparsearray.SparseArray;

public class sparseArrayTest {
    public static void main(String[] args) {
        /*
        *   0 0 0 0 0 0 0
            0 0 1 0 2 0 0
            0 0 1 0 2 0 0
            0 0 0 0 2 0 0
            0 0 0 0 0 0 0
        * */
        //使用二维数组保存此棋盘数据
        int[][] array = new int[5][6];//棋盘数组  第一个数据表示有几列 第二个数据表示一行有几个数据
        //将每一行数据存入数组里
        array[0] = new int[]{0,0,0,0,0,0,0};
        array[1] = new int[]{0,0,1,0,2,0,0};
        array[2] = new int[]{0,0,1,0,2,0,0};
        array[3] = new int[]{0,0,0,0,2,0,0};
        array[4] = new int[]{0,0,0,0,0,0,0};
        //将二维数组输出
        for (int row = 0; row <= 4; row++) {
            //行
            for (int col = 0; col <= 6; col++) {
                //列
                //输出
                System.out.printf(array[row][col] + "\t");//
            }
            System.out.println("\n");
        }

        System.out.println("_________________________________");

        sparseUtil sparseUtil = new sparseUtil();//稀疏数组工具类
        int[][] sparseArray = sparseUtil.doubleArrayToSparseArray(array);//生成的稀疏数组
        //将稀疏数组输出
        for (int row = 0; row < sparseArray.length; row++) {
            //行
            for (int col = 0; col < sparseArray[row].length; col++) {
                //列
                //输出
                System.out.printf(sparseArray[row][col] + "\t");//
            }
            System.out.println("\n");
        }

        int[][] doubleArray = sparseUtil.sparseArrayToDoubleArray(sparseArray);//稀疏数组=>二维数组

        //将二维数组输出
        for (int row = 0; row < doubleArray.length; row++) {
            //行
            for (int col = 0; col < doubleArray[row].length; col++) {
                //列
                //输出
                System.out.printf(doubleArray[row][col] + "\t");//
            }
            System.out.println("\n");
        }
    }
}

class sparseUtil{//关于稀疏数组的工具类
    //二维数组 =》 稀疏数组
    //传入一个二维数组
    public int[][] doubleArrayToSparseArray(int[][] doubleArray){
        //获取此二维数组各维度长度
        int row = doubleArray.length;
        int col = doubleArray[0].length;
        //遍历 获取此数组的有效数据
        int count = 0;//有效数据的个数
        for (int i = 0; i <= 4; i++) {
            //列
            for (int j = 0; j <= 6; j++) {
                //行
                //有效数据
                int value = doubleArray[i][j];
                if (value!=0){
                    count++;
                }
            }
        }
        //稀疏数组第一行数据
        int[] oneRow = {row,col,count};

        //新建一个稀疏数组
        int[][] sparseArray = new int[count+1][3];//第一个数据表示有几列 第二个数据表示一行有几个数据
        //将第一行的数据加入进去
        sparseArray[0] = oneRow;
        //循环 得到有效数据后 获取行和列存入稀疏数组
        int index = 1;//加入稀疏数组时 需要的指针 用来确定在稀疏数组中的第几行 从1开始
        for (int i = 0; i <= 4; i++) {
            //行
            for (int j = 0; j <= 6; j++) {
                //列
                //有效数据
                int value = doubleArray[i][j];
                if (value!=0){
                    int thisRow = i;//表示该所在行
                    int thisCol = j;//表示该所在列
                    //存入稀疏数组
                    sparseArray[index] = new int[]{thisRow,thisCol,value};
                    index++;//指针后移
                }
            }
        }
        return sparseArray;//最后将稀疏数组返回
    }

    //传入稀疏数组 将其转化为  二维数组
    public int[][] sparseArrayToDoubleArray(int[][] sparseArray){
        //先获取稀疏数组头行数据
        int[] header = sparseArray[0];
        int row = header[1];//二维数组行数
        int col = header[0];//二维数组列数
        int count = header[2];//有效数据个数
        int[][] doubleArray = new int[col][row];//将二维数组创建

        //填充其为0
        for (int i = 0; i < col; i++) {
            for (int j = 0; j < row; j++) {
                doubleArray[i][j] = 0;
            }
        }

        //遍历稀疏数组 获取有效数据及位置信息 并填充
        for (int i = 1; i < sparseArray.length; i++) {
            //从第二行开始
            int rowLocal = sparseArray[i][0];//行位置
            int colLocal = sparseArray[i][1];//列位置
            int value = sparseArray[i][2];//值

            //存入二维数组
            doubleArray[rowLocal][colLocal] = value;
        }
        return  doubleArray;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值