1 实际需求

1.1 需求提出

  • 编写五子棋程序,有存盘退出和续上盘的功能。

  • 实现思路:
  • 存盘退出:
    • 定义一个二维数组,默认值是0,黑子表示1,蓝子表示2,然后将二维数组通过流存储到文件中。
    • 换言之:五子棋-->二维数组-->文件。
  • 续上盘:
    • 从文件中通过流读取二维数组,然后将1和2的渲染到五子棋盘上。
    • 换言之:文件-->二维数组-->五子棋。

1.2 分析问题

  • 因为二维数组有很多默认值为0,因此记录这些0很没有意义。需要通过稀疏数组来解决。
  • 此时的存盘退出:
    • 五子棋-->二维数组-->稀疏数组-->文件。
  • 此时的续上盘:
    • 文件-->稀疏数组-->二维数组-->五子棋。    

2 稀疏数组

2.1 基本介绍

  • 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
  • 稀疏数组的处理方法是:
  • ①记录数组一共几行几列,有多少个不同的值。
  • ②把具有不同值的元素的行和列记录在一个小规模的数组中,从而缩小程序的规模。

2.2 稀疏数组的举例说明

  • 假设原来的二维数组如下所示:
0 0 0 22 0 0 15
0 11 0 0 0 17 0
0 0 0 -6 0 0 0
0 0 0 0 0 39 0
91 0 0 0 0 0 0
0 0 28 0 0 0 0
  • 此时我们可以分析出,上面的二维数组是6行7列,并且有8个值。其中第一个值22的下标是0,3。第二个值15的下标是0,6。依次类推。
  • 那么对应的稀疏数组就如下所示:
 
0 6 7 8
1 0 3 22
2 0 6 15
3 1 1 11
4 1 5 17
5 2 3 -6
6 3 5 39
7 4 0 91
8 5 2 28

3 应用实例

3.1 二维数组转稀疏数组

  • 遍历原始的二维数组,得到有效数据的个数num。
  • 根据sum就可以创建稀疏数组sparseArray=new int[sum+1][3]。
  • 将二维数组的有效数据保存到稀疏数组中。
  • 示例:
package com.sunxiaping;

/**
 * 稀疏数组
 */
public class SparseArrayDemo {

    public static void main(String[] args) {
        //创建原始数组表示一个12*12的棋盘,其中默认值0表示没有棋子
        //1表示黑子
        //2表示蓝子
        int[][] sourceArray = new int[12][12];
        sourceArray[1][2] = 1;
        sourceArray[2][3] = 2;

        //输出原始二维数组
        System.out.println("--------输出原始二维数组开始---------");
        printTwoDimensionArray(sourceArray);
        System.out.println("--------输出原始二维数组结束---------");

        int[][] sparseArray = sourceArray2SparseArray(sourceArray);
        //输出稀疏数组
        System.out.println("--------输出输出稀疏数组开始---------");
        printTwoDimensionArray(sparseArray);
        System.out.println("--------输出输出稀疏数组结束---------");

    }

    /**
     * 输出二维数组
     */
    public static void printTwoDimensionArray(int[][] array) {
        for (int[] arr : array) {
            for (int e : arr) {
                System.out.print(e + "\t");
            }
            System.out.println();
        }
    }

    /**
     * 原始数组转换为稀疏数组
     *
     * @return
     */
    public static int[][] sourceArray2SparseArray(int[][] sourceArray) {
        if (null == sourceArray || sourceArray.length == 0) {
            return null;
        }
        //定义num获取稀疏数组的有效数字的个数
        int num = 0;
        int row = sourceArray.length;
        int column = sourceArray[0].length;
        for (int i = 0; i < sourceArray.length; i++) {
            for (int j = 0; j < sourceArray[i].length; j++) {
                if (sourceArray[i][j] != 0) {
                    num++;
                }
            }
        }

        //定义稀疏数组 为num+1行,3列
        int[][] sparseArray = new int[num + 1][3];
        //稀疏数组的第一行为 原始数组的几行几列和总共几个有效值的个数
        sparseArray[0] = new int[]{row, column, num};
        //稀疏数组的其他行 遍历原始二维数组,将非0的有效值保存到稀疏数组中
        int count = 0;//用于记录第几个非0数据
        for (int i = 0; i < sourceArray.length; i++) {
            for (int j = 0; j < sourceArray.length; j++) {
                if (sourceArray[i][j] != 0) {
                    count++;
                    //稀疏数组的第0列就是有效值的行
                    sparseArray[count][0] = i;
                    //稀疏数组的第1列就是有效值的列
                    sparseArray[count][1] = j;
                    //稀疏数组的第2列就是有效值本身
                    sparseArray[count][2] = sourceArray[i][j];
                }
            }
        }

        return sparseArray;
    }

}

3.2 稀疏数组转二维数组

  • 先读取稀疏数组的第一行,根据第一行数据,创建原始的二维数组,比如 sourceArray = new int[12][12]。
  • 再读取稀疏数组的后几行的数据,并赋给原始的二维数组即可。
  • 示例:
package com.sunxiaping;

/**
 * 稀疏数组
 */
public class SparseArrayDemo {

    public static void main(String[] args) {
        //创建原始数组表示一个12*12的棋盘,其中默认值0表示没有棋子
        //1表示黑子
        //2表示蓝子
        int[][] sourceArray = new int[12][12];
        sourceArray[1][2] = 1;
        sourceArray[2][3] = 2;

        //输出原始二维数组
        System.out.println("--------输出原始二维数组开始---------");
        printTwoDimensionArray(sourceArray);
        System.out.println("--------输出原始二维数组结束---------");

        int[][] sparseArray = sourceArray2SparseArray(sourceArray);
        //输出稀疏数组
        System.out.println("--------输出输出稀疏数组开始---------");
        printTwoDimensionArray(sparseArray);
        System.out.println("--------输出输出稀疏数组结束---------");

        sourceArray = sparseArray2SourceArray(sparseArray);
        //输出原始数组
        System.out.println("--------输出原始二维数组开始---------");
        printTwoDimensionArray(sourceArray);
        System.out.println("--------输出原始二维数组结束---------");
    }

    /**
     * 输出二维数组
     */
    public static void printTwoDimensionArray(int[][] array) {
        for (int[] arr : array) {
            for (int e : arr) {
                System.out.print(e + "\t");
            }
            System.out.println();
        }
    }

    /**
     * 原始数组转换为稀疏数组
     *
     * @return
     */
    public static int[][] sourceArray2SparseArray(int[][] sourceArray) {
        if (null == sourceArray || sourceArray.length == 0) {
            return null;
        }
        //定义num获取稀疏数组的有效数字的个数
        int num = 0;
        int row = sourceArray.length;
        int column = sourceArray[0].length;
        for (int i = 0; i < sourceArray.length; i++) {
            for (int j = 0; j < sourceArray[i].length; j++) {
                if (sourceArray[i][j] != 0) {
                    num++;
                }
            }
        }

        //定义稀疏数组 为num+1行,3列
        int[][] sparseArray = new int[num + 1][3];
        //稀疏数组的第一行为 原始数组的几行几列和总共几个有效值的个数
        sparseArray[0] = new int[]{row, column, num};
        //稀疏数组的其他行 遍历原始二维数组,将非0的有效值保存到稀疏数组中
        int count = 0;//用于记录第几个非0数据
        for (int i = 0; i < sourceArray.length; i++) {
            for (int j = 0; j < sourceArray.length; j++) {
                if (sourceArray[i][j] != 0) {
                    count++;
                    //稀疏数组的第0列就是有效值的行
                    sparseArray[count][0] = i;
                    //稀疏数组的第1列就是有效值的列
                    sparseArray[count][1] = j;
                    //稀疏数组的第2列就是有效值本身
                    sparseArray[count][2] = sourceArray[i][j];
                }
            }
        }

        return sparseArray;
    }

    /**
     * 稀疏数组转原始数组
     *
     * @param sparseArray
     * @return
     */
    public static int[][] sparseArray2SourceArray(int[][] sparseArray) {
        if (null == sparseArray || 0 == sparseArray.length) {
            return null;
        }
        if (sparseArray[0].length > 3) {
            throw new RuntimeException("不是稀疏数组");
        }
        //创建原始数组,行是稀疏数组第一行的第一列的值,列是稀疏数组第一行的第二列的值
        int[][] sourceArray = new int[sparseArray[0][0]][sparseArray[0][1]];
        //读取稀疏数组后几行的值,赋值给稀疏数组即可
        for (int i = 1; i < sparseArray.length; i++) {
            sourceArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
        }

        return sourceArray;
    }

}

稀疏数组SparseArray的更多相关文章

  1. 你听过稀疏数组(sparseArray)吗?

    稀疏数组(sparseArray) 基本介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组. 稀疏数组的处理方法是: 1.记录数组一共有几行几列,有多少个不同的值 ...

  2. 数据结构 二维数组-->稀疏数组-->二维数组

    稀疏数组基本概念: 稀疏数组应用场景: 当一个数组大部分的元素为"0",或者为同一个值的数组时,可以使用稀疏数组来保存该数组 处理方法: 1>记录数组一共有几行几列,有多少不 ...

  3. SparseArray HashMap 稀疏数组 二分法

    简介 HashMap是java里比较常用的一个集合类,我们常用其来缓存一些处理后的结果,但是在Android项目中,Eclipse却给出了一个 performance 警告.意思就是说用SparseA ...

  4. C#数据结构与算法系列(二):稀疏数组(SparseArray)

    1.介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组.    稀疏数组的处理方法是: 1.记录数组一共有几行几列,有多少个不同的值    2.把具有不同值的元素的 ...

  5. JAVA描述算法和数据结构(01):稀疏数组和二维数组转换

    本文源码:GitHub·点这里 || GitEE·点这里 一.基本简介 1.基础概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵:与之相反, ...

  6. 稀疏数组(java实现)

    1.稀疏数组 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组. 稀疏数组的处理方法是: 1.1记录数组一共有几行几列,有多少个不同的值 1.2把具有不同值的元素的行列 ...

  7. java实现稀疏数组压缩

    package sparseArray; public class SparseArray { public static void main(String[] args) { // TODO Aut ...

  8. Java数据结构之稀疏数组(Sparse Array)

    1.需求 编写的五子棋程序中,有存盘退出和续上盘的功能.因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据,为了压缩存储所以采用稀疏数组. 2.基本介绍 当一个数组中大部分元素为0,或者为 ...

  9. 【学习总结】java数据结构和算法-第三章-稀疏数组和队列

    相关链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 稀疏数组 队列 稀疏数组 稀疏数组介绍 图示 应用实例 代码实现 SparseArray.java:与二 ...

随机推荐

  1. Struts2-Ajax整合之Jquery版本

    <纯JavaScript版本  http://www.cnblogs.com/hzb462606/p/8934787.html  > 大部门跟JavaScript版本一致,就是<sc ...

  2. logstash 写入数据到elasticsearch 索引相差8小时解决办法

    问题说明 Logstash用的UTC时间, logstash在按每天输出到elasticsearch时,因为时区使用utc,造成每天8:00才创建当天索引,而8:00以前数据则输出到昨天的索引 # 使 ...

  3. CentOS7 下SaltStack部署

    一,概念SaltStack是一个服务器基础架构集中化管理平台,具备配置管理.远程执行.监控等功能,一般可以理解为简化版的puppet和加强版的func.SaltStack基于Python语言实现,结合 ...

  4. 高级测试工程师面试必问面试基础整理——python基础(一)(首发公众号:子安之路)

    现在深圳市场行情,高级测试工程师因为都需要对编程语言有较高的要求,但是大部分又没有python笔试机试题,所以面试必问python基础,这里我整理一下python基本概念,陆续收集到面试中python ...

  5. C++随笔(1)——关于C++11中的线程创建,join和detach

    主要是和之前的博文有关,之前在这里有一部分代码是通过创建新的进程来应对新的用户请求的,但是基本没怎么解释怎么用的,所以这里做点小笔记. join 首先引入的库: #include <thread ...

  6. aliyun搭博客从零到一

    一.基础环境 lnmp      1台负载均衡SLB     2台ECS    1台 RDS  二.lnmp搭建 1.#配置nginx的yum仓库 2.#yum install  -y  nginx ...

  7. 简述前后端项目RSA+AES加解密

    一.登录机制 在项目中,我们可以大致得出一个登录的过程,主要分为  登录验证.登录保持.退出三个部分.登录验证是指客户端提供用户名和密码,向服务器提出登录请求,服务器判断客户端是否可以登录并向客户端确 ...

  8. mysql——触发器——前期整理笔记00

    一.触发器 触发器是由事件来出发某个动作.这些事件包括insert语句.update语句和delete语句. 当数据库系统执行这些事件时,就会激活触发器执行相应得动作. 触发器是有insert.upd ...

  9. Win10无法安装.net framework 3.5出错提示无法安装以下功能该怎么办?

    在Windows操作系统中,.NET Framewor对今天应用程序的成功提供了的安全解决方案,它能强化两个安全模型间的平衡.在提供对资源的访问,以便以完成有用的工作,对应用程序的安全性作细致的控制以 ...

  10. 使用new关键字创建对象数组(C#,C++,Java)

    今天遇到一个题目 分析下面的代码,判断代码是否有误. using System; namespace Test1 { class Point { public int x; public int y; ...