09 稀疏数组

稀疏数组

image

image

代码

package com.zhan.base04Array;

public class Test09 {
    // 稀疏数组
    public static void main(String[] args) {
        // 创建一个二维数组 ,模拟五子棋,空的地方为0 ,黑棋为1,白棋为2

        //原始数组和稀疏数组表达的意义是一样的
        System.out.println("原始数组和稀疏数组表达的意义是一样的");
        System.out.println("很明显地看出,稀疏数组比原始数组更节省空间资源");

        // 初始化一个原始数组
        int[][] a=new int[11][11];
        a[1][2]=1;
        a[2][3]=2;
        // 直接初始化一个等价的稀疏数组
        int[][] b={{11,11,2},   {1,2,1},     {2,3,2}};  // 固定三列

        // 模拟输出棋盘上的情况
        printArrays1(a);  //输出 原始数组
        System.out.println("------------------------------------------------");
        printArryas2(a);  //输出 稀疏数组,本质上也是二维数组
        System.out.println("------------------------------------------------");
        printArrays3(b);

    }


    public static void printArrays1(int[][] a){

        System.out.println("输出原始数组");
        for (int[] ints : a) {            // 注意遍历二维数组的增强型 for 循环
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
    }  //输出原始数组

    public static void printArryas2(int[][] a){
        // 转换为稀疏数组
        // 第一步,创建稀疏数组
        int sum=0;  // 有效数字的个数
        // 遍历原始数组,获取有效数字的个数
        for (int[] ints : a) {
            for (int x : ints) {
                if(x != 0){     // 数字不等于0,有效数字,sum++
                    sum++;
                }
            }
        }
        int[][] b=new int[sum+1][3];
        // 行数为有效数字的个数加 1(放原始数组的规模的有效数组的个数),列数固定为3

        // 第二步,初始化稀疏数组
        b[0][0]=11;   b[0][1]=11;   b[0][2]=sum;   //初始化第零行


        // 初始化下面的行
        int rows=0;  // 这对应着有效数字所在的行数,一开始为第1行,   !!!实际上为第二行,数组索引

        // 遍历原始数组,将有效数值赋值给 稀疏数组
        for (int i = 0; i < a.length; i++) {

            for (int j = 0; j < a[i].length; j++) {
                if (a[i][j]!=0){     // 判断有效数字
                    rows++;
                    b[rows][0]=i;   // 将 有效数字所在的 行数,赋值给稀疏数组对应的元素
                    b[rows][1]=j;   // 将 有效数字所在的 列数,赋值给稀疏数组对应的元素
                    b[rows][2]=a[i][j];  // 将有效数字的值,赋值给稀疏数组对应的元素
                }
                // 遍历完原始数组的某一行后,有效数字所在的行数将会变大,所以 rows +1

            }
        }
        // 输出 稀疏数组
        System.out.println("输出 稀疏数组");
        for (int i = 0; i < b.length; i++) {
            for (int j = 0; j < b[i].length; j++) {
                System.out.print(b[i][j]+"\t");   // +"\t" 可以对齐   , +" " 不能对齐
            }
            System.out.println();
        }
    }  // 将原始数组转换为稀疏数组再输出

    public static void printArrays3(int[][] b){
        // 将稀疏数组还原成原始数组
        int[][] arrays=new int [ b[0][0] ]   [ b[0][1] ];  // 还原原始数组的规模
        // 还原原始数组的各个数值
        for (int i = 1; i < b.length; i++) {   // 从 1 开始,因为此时 稀疏数组的第零行的数据无意义
            arrays[  b[i][0]  ] [ b[i][1] ]   =b[i][2];    // 一次还原一个数字
        }
        // 输出原后的原始数组
        System.out.println("输出还原后的原始数组");
        for (int[] ints : arrays) {            // 注意遍历二维数组的增强型 for 循环
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }

    } // 将稀疏数组还原成原始数组 再输出

}
posted @   被占用的小海海  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示