27、Java基础之稀疏数组

稀疏数组

  • 需求:编写五子棋游戏中,有存盘退出和续上盘的功能。

在这里插入图片描述

  • 分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据。

  • 解决:稀疏数组

  • 数组中大部分为同一值的数组时,可用稀疏数组来保存。

  • 稀疏数组的处理方式是:
    1、记录数组一共有几行几列,有多少个不同值
    2、把具有不同值的元素和行列及值记录在一个小规模的数组中,用来缩小程序规模
    如下图:左边是原始数组,右边是稀疏数组
    在这里插入图片描述

  • 稀疏数组实例

public class B9XiShuShuZu {
    public static void main(String[] args) {
        /**
         *  1.创建一个二维数组  11*11  0 无子   1  黑子   2 白子
         */
        int[][] arr = new int[11][11];
        arr[1][2] = 1;
        arr[2][3] = 2;

        /**
         *  输出原始稀疏数组
         */
        pullErWeiShuZu(arr);
        System.out.println("=================");


        /**
         *    转换为稀疏数组储存
         *    保留有效值的个数
         */
        int count = 0;
        for (int[] arr1:arr){
            for (int b:arr1){
               if (b!=0){
                   count++;
               }
            }
        }
        System.out.println("有效数值有"+count+"个");
        System.out.println("=================");

        /**
         * 创建一个稀疏数组的数组
         */
        int[][] arrXi = new int[count+1][3]; //稀疏数组 有记录数组 11 行,11 列的首行
        arrXi[0][0] = 11;       // 11行
        arrXi[0][1] = 11;       // 11列
        arrXi[0][2] = count;    // 有效值个数


        /**
         *  输出稀疏数组
         */
        pullErWeiShuZu(arrXi);


        /**
         *    遍历二维数组,将非零值,存放在稀疏数组中
         */
        int count1 = 1;
        for (int i= 0;i<arr.length;i++){
            for (int j= 0;j<arr[i].length;j++){
                if(arr[i][j] != 0){
                  //从第二行开始放置
                    arrXi[count1][0]=i;         //有效值的行坐标
                    arrXi[count1][1]=j;         //有效值的列坐标
                    arrXi[count1][2]=arr[i][j]; //有效值的数值
                    count1++;
                }
            }
        }

        System.out.println("=================");
        /**
         *  输出稀疏数组
         */
        pullErWeiShuZu(arrXi);
        System.out.println("=================");
        /**
         * 还原稀疏数组
         */
        int[][] arrHuanYuan = new int[arrXi[0][0]][arrXi[0][1]];
        for(int i= 1;i<arrXi.length;i++){
            arrHuanYuan[arrXi[i][0]][arrXi[i][1]] = arrXi[i][2];
        }
        pullErWeiShuZu(arrHuanYuan);

    }

    /**
     * 遍历二维数组
     * @param arr
     */
    public static void pullErWeiShuZu(int[][] arr){
        for (int[] arr1:arr){
            for (int b:arr1){
                System.out.print(b+"\t");
            }
            System.out.println();
        }
    }

    /**
     * 统计有效值个数
     * @param arr
     * @return
     */
    public static int  tongJiYouXiaoZhi(int[][] arr){
        int count = 0;
        for (int[] arr1:arr){
            for (int b:arr1){
                if (b!=0){
                    count++;
                }
            }
        }
        System.out.println("有效数值有"+count+"个");
        return count;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值