Java数据结构实现二维数组与稀疏数组转换详解

yizhihongxing

Java数据结构实现二维数组与稀疏数组转换详解

一、二维数组与稀疏数组

在介绍二维数组与稀疏数组的转换之前,需要先了解它们的定义和特点。

1.二维数组

二维数组是一个由多个一维数组组成的数组。可以将它理解为是一个由行和列构成的矩阵。其中,行和列的数量是固定的,而且必须预先指定。

二维数组的声明方式为:

数据类型[][] 数组名;

例:

int[][] arr;

二维数组的初始化方式有两种:

1.静态初始化:在声明的同时为数组元素赋初值。

数据类型[][] 数组名 = {{元素1,元素2,...},{元素1,元素2,...},...};

例:

int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};

2.动态初始化:在声明数组时只指定数组元素的类型和数量,然后再分别为每个数组元素赋初值。

数据类型[][] 数组名 = new 数据类型[行数][列数];

例:

int[][] arr = new int[3][3];
arr[0][0] = 1;
arr[0][1] = 2;
...

2.稀疏数组

稀疏数组是一种压缩存储的数组。它通常应用在当数组中大部分的元素值为默认值或者某一个值的情况下。稀疏数组通常由3列组成,分别为:行数、列数以及具体数值。通常情况下,稀疏数组的行数为原数组中有效元素的个数+1,列数为3。

稀疏数组的转换过程如下:

1.遍历原数组,得到有效元素的个数count;
2.根据count+1创建一个稀疏数组sparse_arr;
3.将sparse_arr的第一行赋值为原数组的行数、列数和有效元素的个数;
4.遍历原数组,将每个非0的元素的行列和值存入稀疏数组sparse_arr中。

示例:

原始数组为:

int[][] arr = {{0,0,0,0,0},
               {0,0,1,0,0},
               {0,0,0,2,0},
               {0,0,3,0,0},
               {0,0,0,0,0}};

转换为稀疏数组后的结果为:

sparse_arr = {{5,5,3},
              {1,3,1},
              {2,4,2},
              {3,2,3}}

二、Java实现二维数组与稀疏数组的转换

1.生成原始数组

前文示例已经给出。

2.生成稀疏数组

代码如下:

public static int[][] toSparseArr(int[][] arr) {
    // 遍历原数组得到非零元素个数num
    int num = 0;
    for (int[] row : arr) {
        for (int data : row) {
            if (data != 0) {
                num++;
            }
        }
    }

    // 创建稀疏数组sparseArr
    int[][] sparseArr = new int[num + 1][3];

    // 给稀疏数组sparseArr的第一行赋值
    sparseArr[0][0] = arr.length;
    sparseArr[0][1] = arr[0].length;
    sparseArr[0][2] = num;

    // 遍历二维数组,将非零的值存放到sparseArr中
    int count = 0; // count用于记录是第几个非零数据
    for (int i = 0; i < arr.length; i++) {
        for (int j = 0; j < arr[0].length; j++) {
            if (arr[i][j] != 0) {
                count++;
                sparseArr[count][0] = i;
                sparseArr[count][1] = j;
                sparseArr[count][2] = arr[i][j];
            }
        }
    }
    return sparseArr;
}

3.生成原始数组

代码如下:

public static int[][] toNormalArr(int[][] sparseArr) {
    // 读取稀疏数组的行列信息
    int row = sparseArr[0][0];
    int col = sparseArr[0][1];
    int num = sparseArr[0][2];

    // 创建原始二维数组
    int[][] normalArr = new int[row][col];

    // 根据稀疏数组的值,还原原始二维数组
    for (int i = 1; i <= num; i++) {
        int r = sparseArr[i][0];
        int c = sparseArr[i][1];
        int val = sparseArr[i][2];
        normalArr[r][c] = val;
    }

    return normalArr;
}

三、示例

1.将示例二维数组转换成稀疏数组

int[][] arr = {{0,0,0,0,0},
               {0,0,1,0,0},
               {0,0,0,2,0},
               {0,0,3,0,0},
               {0,0,0,0,0}};
int[][] sparseArr = toSparseArr(arr);

输出结果:

5 5 3
1 3 1
2 4 2
3 2 3

2.将示例稀疏数组还原成原始二维数组

int[][] sparseArr = {{5,5,3},
                     {1,3,1},
                     {2,4,2},
                     {3,2,3}};
int[][] normalArr = toNormalArr(sparseArr);

输出结果:

0 0 0 0 0
0 0 1 0 0
0 0 0 2 0
0 0 3 0 0
0 0 0 0 0

四、总结

本文介绍了Java实现二维数组与稀疏数组的转换过程,并给出了相关的示例代码。需要注意的是,稀疏数组的转换过程可以运用到实际项目中进行数据的压缩和存储。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构实现二维数组与稀疏数组转换详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • SpringBoot2.3集成ELK7.1.0的示例代码

    以下是Spring Boot 2.3集成ELK 7.1.0的示例代码的完整攻略: 步骤1:安装和配置ELK Stack 首先,安装Elasticsearch、Logstash和Kibana。您可以从官方网站下载并按照它们的安装指南进行安装。 配置Elasticsearch: 打开elasticsearch.yml配置文件。 设置cluster.name为您的…

    other 2023年10月17日
    00
  • github如何添加ssh

    如何在GitHub中添加SSH Key 在GitHub中添加SSH Key可以让你在使用Git的过程中更加便捷,不需要每次都输入密码。本文将向你展示如何在GitHub上添加SSH Key。 步骤一:生成SSH Key 首先,你需要在本地生成SSH Key。打开终端(或命令行),输入以下命令: ssh-keygen -t rsa -b 4096 -C &quo…

    其他 2023年3月28日
    00
  • 传言iPhone6s将采用SiP系统级封装技术兼顾轻薄与性能

    传言iPhone6s将采用SiP系统级封装技术兼顾轻薄与性能 什么是SiP系统级封装技术 SiP,即System-in-Package,是指将多个不同尺寸、不同芯片技术的IC封装在一起组成一个具有完整系统功能的芯片方案。SiP技术实质上是一种多芯片封装方式,可将处理器、存储器、系统控制器、射频IC等多种芯片封装到同一个小巧的封装中,实现系统的集成度、可靠性和…

    other 2023年6月25日
    00
  • react如何用懒加载减少首屏加载时间

    React使用懒加载是一种减少首屏加载时间的常用技巧。懒加载是指在需要的时候再加载组件或者模块,而不是在初始加载时就全部加载。React使用懒加载可以使得首屏只加载必要的内容,从而提高页面加载速度和用户体验。 以下是使用懒加载的完整攻略: 第一步:安装React.lazy React.lazy函数允许您能够使用懒加载加载组件。要使用它,请先安装React.l…

    other 2023年6月25日
    00
  • 你值得拥有的Android Studio开发小技巧

    你值得拥有的Android Studio开发小技巧 Android Studio是是谷歌推出的一款专门用于Android应用开发的IDE,拥有很多强大的功能和小技巧,本文将向大家介绍几个非常实用的小技巧,帮助开发者更加高效地使用Android Studio进行开发。 快捷键技巧 使用搜索快速跳转 在Android Studio中,你可以使用搜索功能来快速跳转…

    other 2023年6月27日
    00
  • IDEA中使用Git拉取代码时报 Git pull failed原因及解决方法

    下面是 “IDEA中使用Git拉取代码时报 Git pull failed原因及解决方法”的完整攻略: 1. Git pull failed的常见原因 在使用IDEA中进行Git拉取代码时,可能会遇到Git pull failed的错误提示,原因主要包括以下几种: 1.1 远程仓库不存在 Git pull failed的原因之一是指定的远程仓库不存在。比如,…

    other 2023年6月27日
    00
  • qt之qtscript

    Qt之QtScript QtScript是Qt框架中的一个模块,它提供了一种脚本语言,可以在Qt应用程序中使用JavaScript脚本。本攻略将详细介绍QtScript的使用方法,包括基本概、安装配置和示例说明。 基本概念 QtScript是Qt框架中的一个模块,它提供了一种脚语言,可以在Qt应用程序中使用JavaScript脚本。在QtScript,我们可…

    other 2023年5月6日
    00
  • Android内存泄漏终极解决篇(下)

    下面是对于“Android内存泄漏终极解决篇(下)”的完整攻略。 需要解决的问题 我们很容易在开发Android应用时遇到内存泄漏的问题,这一问题可能是由于合理的业务逻辑与错误的内存使用方式组合在一起导致的。内存泄露会导致应用程序的性能降低,甚至会崩溃。因此,在开发阶段发现并解决内存泄漏问题非常重要。 解决内存泄漏的步骤 步骤1:分析内存泄漏 首先,需要找到…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部