java笔记(4) 稀疏数组实现实例

没有原理讲解,仅记录一个实现代码,作为参考和笔记使用
如题,稀疏数组仅在原始数组有效数据较少的情况下起压缩空间的作用
实现过程:
首先为了方便查看和确认,封装一个打印二维数组的方法

    public static void printArray(int[][] arrays) {
        for (int[] array : arrays) {
            for (int element : array) System.out.print(element + "\t");
            System.out.println();
        }
    }

创建待压缩的原始数组

    int[][] originArray = new int[11][11];
    originArray[1][2] = 1;
    originArray[2][3] = 2;
    //输出原始数组
    printArray(originArray);

原始数组长这样:
(原始数组
可见其中存在许多0元素,浪费了许多空间,可以通过创建稀疏数组来进行压缩。


创建稀疏数组:

//首先要获取原数组中有效数据的个数,用来确定稀疏数组的大小:
    int sum = 0;
    for (int i = 0; i < originArray.length; i++) {
        for (int j = 0; j < originArray[0].length; j++) {
            if (originArray[i][j] != 0) sum++;
        }
    }
//sum即为有效数据的个数,则稀疏数组总共有sum+1行,其中第一行存放数组尺寸和有效数据个数,后续行存放有效数据坐标和值
    int[][] sparseArray = new int[sum + 1][3];
    sparseArray[0][0] = originArray.length;
    sparseArray[0][1] = originArray[0].length;
    sparseArray[0][2] = sum;
//再次遍历原数组,记录有效数据的坐标和值
    int sparseLine = 1; //标记稀疏数组的行号应从1开始,因为第"0"行用来记录数组尺寸了
    for (int i = 0; i < originArray.length; i++) {
        for (int j = 0; j < originArray[0].length; j++) {
            if (originArray[i][j] != 0) {
                sparseArray[sparseLine][0] = i;
                sparseArray[sparseLine][1] = j;
                sparseArray[sparseLine++][2] = originArray[i][j];
            }
        }
    }
//至此,稀疏数组就创建完成了,打印看一下
    printArray(sparseArray);

稀疏数组


还原数组

根据稀疏数组中记录的数组信息和有效值信息,还原数组:

//首先,根据第"0"行的信息,创建跟原数组一样尺寸的数组
    int[][] array3 = new int[sparseArray[0][0]][sparseArray[0][1]];
//从第"1"遍历稀疏数组,将记录的值还原到新数组
    for (int i = 1; i < sparseArray.length; i++)
        restoreArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
//打印看一下
    printArray(restoreArray);

还原数组

posted @   hiibird  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示