Java 稀疏数组

稀疏数组是一种数组结构,这是一种压缩算法。

稀疏数组可以看做是普通数组的压缩,但是这里说的普通数组是指无效数据量远大于有效数据量的数组

1 概述

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

稀疏数组的处理方式

  • 记录数组一共有几行几列,有多少个不同值
  • 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模

如下图:左边是原始数组,右边是稀疏数组

2 实例

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

问题:因为二维数组中很多值是默认值0,因此记录了很多无意义的数组。

解决方案:稀疏数组

2.1 原始数组

package com.study;

import java.util.Arrays;

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

        //1 输出原始数组
        int sum = 0;//有效值
        System.out.println("原始数组:");
        for (int[] ints : arr) {
            for (int anInt : ints) {
                System.out.print(anInt + "\t");
                //统计有效值个数
                if (anInt != 0) {
                    sum++;
                }
            }
            System.out.println();
        }
        System.out.println("有效值个数:"+sum);
    }

}

2.2 稀疏数组

package com.study;

import java.util.Arrays;

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

        //1 输出原始数组
        int sum = 0;//有效值
        System.out.println("原始数组:");
        for (int[] ints : arr) {
            for (int anInt : ints) {
                System.out.print(anInt + "\t");
                //统计有效值个数
                if (anInt != 0) {
                    sum++;
                }
            }
            System.out.println();
        }

        System.out.println("===================================");
        System.out.println("有效值个数:" + sum);

        //2 创建一个稀疏数组
        //第一行记录该稀疏数组是 11 行 11列 共 sum 个有效值
        int[][] arr2 = new int[sum + 1][3];
        arr2[0][0] = 11;
        arr2[0][1] = 11;
        arr2[0][2] = sum;

        //遍历二维数组,将非0值,存放到稀疏数组中
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] != 0) {
                    count++;
                    arr2[count][0] = i;
                    arr2[count][1] = j;
                    arr2[count][2] = arr[i][j];
                }
            }
        }

        //输出稀疏数组
        System.out.println("稀疏数组:");

        for (int i=0;i<arr2.length;i++){
            for (int j=0;j<arr2[i].length;j++){
                System.out.print(arr2[i][j]+"\t");
            }
            System.out.println();
        }
    }

}

2.3 稀疏数组还原

package com.study;

import java.util.Arrays;

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

        //1 输出原始数组
        int sum = 0;//有效值
        System.out.println("原始数组:");
        for (int[] ints : arr) {
            for (int anInt : ints) {
                System.out.print(anInt + "\t");
                //统计有效值个数
                if (anInt != 0) {
                    sum++;
                }
            }
            System.out.println();
        }

        System.out.println("===================================");
        System.out.println("有效值个数:" + sum);

        //2 创建一个稀疏数组
        //第一行记录该稀疏数组是 11 行 11列 共 sum 个有效值
        int[][] arr2 = new int[sum + 1][3];
        arr2[0][0] = 11;
        arr2[0][1] = 11;
        arr2[0][2] = sum;

        //遍历二维数组,将非0值,存放到稀疏数组中
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] != 0) {
                    count++;
                    arr2[count][0] = i;
                    arr2[count][1] = j;
                    arr2[count][2] = arr[i][j];
                }
            }
        }

        //输出稀疏数组
        System.out.println("稀疏数组:");

        for (int i = 0; i < arr2.length; i++) {
            for (int j = 0; j < arr2[i].length; j++) {
                System.out.print(arr2[i][j] + "\t");
            }
            System.out.println();
        }

        System.out.println("=========================");

        //3.稀疏数组还原
        System.out.println("稀疏数组还原:");
        //3.1 读取稀疏数组
        int[][] arr3 = new int[arr2[0][0]][arr2[0][1]];

        //3.2 给其中的元素还原它的值
//        System.out.println(arr2.length);3
        for (int i = 1; i < arr2.length; i++) {
            arr3[arr2[i][0]][arr2[i][1]] = arr2[i][2];
        }

        //3.3 打印
        for (int[] ints : arr3) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
    }

}
posted @   MR·Jerry  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
欢迎阅读『Java 稀疏数组』
点击右上角即可分享
微信分享提示