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

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日

相关文章

  • 成果解决google地球无法登陆 无法连接数据库问题

    成果解决Google Earth无法登陆无法连接数据库问题 Google Earth是一款流行的虚拟地球软件,但有时用户可能会遇到无法登陆或无法连接数据库的问题。本攻略将提供些解决这些问题的方法,并提供两个示例。 解决无法登陆问题 如果您无法登陆Google Earth,以下是一可能的解决方法: 检查您的网络连接。确保您的计算机已连接到互联网,并且没有任何网…

    other 2023年5月9日
    00
  • C++指针和数组:字符和字符串、字符数组的关联和区别

    C++中,数组和指针是非常重要的概念,特别是在处理字符和字符串方面更加常见。本篇攻略将从字符、字符串、字符数组、指针等多个维度深入剖析它们之间的关系和区别,以及在实际使用中该如何注意。 1. 字符和字符串 1.1 字符 在C++中,字符是以ASCII编码方式存储的,每个字符占1个字节(8位),用单引号’ ‘表示。例如: char ch = ‘A’; // 定…

    other 2023年6月20日
    00
  • ahjesus linux连接阿里云ubuntu服务器更改默认账号和密码、创建子账户的步骤

    下面是“ahjesus linux连接阿里云ubuntu服务器更改默认账号和密码、创建子账户的步骤”的完整攻略。 一、登录服务器 首先,需要使用SSH登录到服务器。如果你是Windows用户,可以使用一些SSH客户端,比如PuTTY。如果你是Linux或Mac用户,可以直接在终端使用SSH命令。 示例1:使用PuTTY登录服务器 打开PuTTY,输入服务器的…

    other 2023年6月27日
    00
  • flash怎么设计铅笔人拆分又组合的动画?

    首先,我们需要了解几个基础概念: 形状(Shape):包含了线条、填充和样式的图形对象。 画笔(Brush):用于绘制形状的工具,包括钢笔工具、直线工具、椭圆工具等。 描边(Stroke):绘制形状边缘的外边框。 填充(Fill):填充形状内部的颜色或图案。 运动(Motion):形状或对象的移动、旋转、缩放等。 动画(Animation):对形状或对象进行…

    other 2023年6月27日
    00
  • Win11如何修改用户文件夹名称?Win11修改用户文件夹名称教程

    当我们在安装 Windows 11 操作系统时,系统会默认创建一个用户名,该用户名将成为我们的用户文件夹名称,有时该文件夹名称并不符合我们的需求和喜好,这时我们可以通过以下方法修改用户文件夹名称: 1. 创建本地管理员账户 在 Windows 11 系统中,我们无法直接修改当前的用户文件夹名称,因此需要创建一个本地管理员账户,用该账户来修改用户文件夹名称,请…

    other 2023年6月27日
    00
  • Android10 客户端事务管理ClientLifecycleManager源码解析

    Android10 客户端事务管理ClientLifecycleManager源码解析 什么是ClientLifecycleManager ClientLifecycleManager是Android10中用于管理客户端事务的一个类。它通过协调客户端和系统间的通信和交互,来确保客户端的正确使用和可靠性。 为什么使用ClientLifecycleManager…

    other 2023年6月25日
    00
  • echarts和v-chart使用心得

    ECharts和v-chart使用心得 ECharts是一款由百度开源的图表库,它基于Javascript,可以方便地在网页中插入各种图表。而v-chart是基于ECharts进行封装的Vue组件库,可以更加方便地在Vue项目中使用ECharts。 ECharts的使用心得 在使用ECharts的过程中,我发现以下几点是需要注意的: 1. 数据格式要有规律 …

    其他 2023年3月28日
    00
  • 在spring中实例化bean无效的问题

    在Spring中,实例化bean的问题通常是由Spring容器未正确配置或代码不正确导致的。下面是实例化bean无效的问题的完整攻略。 1. 检查Spring配置文件 在Spring中配置bean的最常见方法是使用XML文件。如果bean没有正确配置,它们就无法被正确实例化。XML文件中的错误可能包括: 错误的XML语法 错误的命名空间或标记名称 不正确的属…

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