Java稀疏数组详细图文教程

 更新时间:2023年09月28日 08:23:19   作者:楠枬  
当一个数组中的大部分元素为相同的值,可使用稀疏数组来保存该数组,可以将稀疏数组看做是普通数组的压缩,这篇文章主要给大家介绍了关于Java稀疏数组的相关资料,需要的朋友可以参考下

1.稀疏数组

稀疏数组(Sparse Array):当一个数组中的大部分元素为相同的值,可使用稀疏数组来保存该数组,可以将稀疏数组看做是普通数组的压缩

例如

数组arr中许多值为0,若对二维数组直接进行存储,则会存储许多相同的数值0,造成空间的浪费,此时,我们可以用稀疏数组对其进行存储

2.稀疏数组的使用

要对二维数组进行存储,我们需要知道二维数组的行和列不同数值的数量以及不同元素的位置和值

稀疏数组的第一行,存放二维数组arr的行数、列数、不同数值的数量sum

 后面几行,存放不同值元素在二维数组arr中的行、列、数值

代码实现

创建二维数组

 int[][] arr = new int[6][5];
 arr[1][0] = 1;
 arr[1][3] = 6;
 arr[4][3] = 2;

2.1 二维数组转换为稀疏数组

(1)遍历二维数组,确定不同元素的个数sum

        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[0].length; j++) {
                if(arr[i][j] != 0){
                    sum++;
                }
            }
        }

(2)根据sum创建稀疏数组

int[][] sparseArr = new int[sum+1][3];

(3) 遍历二维数组,对稀疏数组进行赋值

        //稀疏数组的第一行分别存放二维数组的行数、列数以及不同元素的个数
        sparseArr[0][0] = arr.length;
        sparseArr[0][1] = arr[0].length;
        sparseArr[0][2] = sum;
        //再对不同元素进行存储
        int k = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[0].length; j++) {
                if(arr[i][j] != 0){
                    k++;
                    //分别存放不同元素的行、列以及数值
                    sparseArr[k][0] = i;
                    sparseArr[k][1] = j;
                    sparseArr[k][2] = arr[i][j];
                }
            }
        }

2.2 稀疏数组转换为二维数组

(1)创建二维数组

int[][] arr1 = new int[sparseArr[0][0]][sparseArr[0][1]];

(2)遍历稀疏数组, 对不同值元素进行赋值

        //遍历稀疏数组,对不同值元素进行赋值
        for (int i = 1; i < sparseArr.length; i++) {
           arr1[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }

完整代码

public class Test {
    public static void main(String[] args) {
        //创建二维数组
        int[][] arr = new int[6][5];
        arr[1][0] = 1;
        arr[1][3] = 6;
        arr[4][3] = 2;
        System.out.println("****二维数组****");
        for (int[] row: arr) {
            for (int data: row) {
                System.out.printf("%d ",data);
            }
            System.out.println();
        }
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[0].length; j++) {
                if(arr[i][j] != 0){
                    sum++;
                }
            }
        }
        //创建稀疏数组
        int[][] sparseArr = new int[sum+1][3];
        //稀疏数组的第一行分别存放二维数组的行数、列数以及不同元素的个数
        sparseArr[0][0] = arr.length;
        sparseArr[0][1] = arr[0].length;
        sparseArr[0][2] = sum;
        //再对不同元素进行存储
        int k = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[0].length; j++) {
                if(arr[i][j] != 0){
                    k++;
                    //分别存放不同元素的行、列以及数值
                    sparseArr[k][0] = i;
                    sparseArr[k][1] = j;
                    sparseArr[k][2] = arr[i][j];
                }
            }
        }
        System.out.println("****稀疏数组****");
        for (int[] row: sparseArr) {
            for (int data: row) {
                System.out.printf("%d ",data);
            }
            System.out.println();
        }
        //创建二维数组
        int[][] arr1 = new int[sparseArr[0][0]][sparseArr[0][1]];
        //遍历稀疏数组,对不同值元素进行赋值
        for (int i = 1; i < sparseArr.length; i++) {
           arr1[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        System.out.println("****二维数组****");
        for (int[] row: arr1) {
            for (int data: row) {
                System.out.printf("%d ",data);
            }
            System.out.println();
        }
    }
}

运行结果

总结 

到此这篇关于Java稀疏数组的文章就介绍到这了,更多相关Java稀疏数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Java网络编程

    详解Java网络编程

    网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。本文介绍了一些网络编程基础的概念,并用Java来实现TCP和UDP的Socket的编程,来让读者更好的了解其原理
    2021-06-06
  • Java 为什么要避免使用finalizer和Cleaner

    Java 为什么要避免使用finalizer和Cleaner

    这篇文章主要介绍了Java 为什么要避免使用finalizer和Cleaner,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-03-03
  • Java线程状态运行原理解析

    Java线程状态运行原理解析

    这篇文章主要介绍了Java线程状态运行原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • idea创建javaweb原生项目的实现示例

    idea创建javaweb原生项目的实现示例

    这篇文章主要介绍了idea创建javaweb原生项目的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • DispatcherServlet处理器的适配和处理解析

    DispatcherServlet处理器的适配和处理解析

    这篇文章主要为大家介绍了DispatcherServlet的处理器的适配和处理流程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 详解springBoot启动时找不到或无法加载主类解决办法

    详解springBoot启动时找不到或无法加载主类解决办法

    这篇文章主要介绍了详解springBoot启动时找不到或无法加载主类解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 集群环境中使用ehcache_动力节点Java学院整理

    集群环境中使用ehcache_动力节点Java学院整理

    这篇文章主要为大家详细介绍了集群环境中使用ehcache的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • SpringBoot如何整合SpringDataJPA

    SpringBoot如何整合SpringDataJPA

    这篇文章主要介绍了SpringBoot整合SpringDataJPA代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java毕业设计实战之养老院管理系统的实现

    Java毕业设计实战之养老院管理系统的实现

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+SSM+JSP+Easyui+maven+mysql实现一个养老院管理系统,大家可以在过程中查缺补漏,提升水平
    2022-03-03
  • Java ArrayList 实现实例讲解

    Java ArrayList 实现实例讲解

    ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。这篇文章主要介绍了java ArrayList 实现的相关资料,需要的朋友可以参考下
    2016-11-11

最新评论