Java二维数组与稀疏数组相互转换实现详解
作者:小黎的培培笔录 发布时间:2022-10-28 07:27:33
一、稀疏数组
1、什么是稀疏数组
当一个数组中大部分元素为0,或者为同一个值的数组时,可以用稀疏数组来保存该数组。稀疏数组,记录一共有几行几列,有多少个不为零的值或相同的值。
简单来说就是将大规模的数组缩小成小规模的数据,从而减少空间浪费。
2、图示
上面的图示中,左侧是二维数组,右侧是稀疏数组,将二维数组转成稀疏数组,明显的可以看出空间减少了,可以有效的节约空间,提高效率。那么二维数组怎么生成稀疏数组呢?其实很简单,因为二维数组有特定的格式,按格式将二维数组中的数据放入稀疏数组即可。
3、稀疏数组的表达方式
稀疏数组的列是固定的,只有三列,第一列表示二维数组的行,第二列表示二维数组的列,第三列表示二维数组非零数的个数。稀疏数组的第一行是固定的,用来表示总行数,总列数,总个数。其余行数根据个数而定。
二、二维数组→稀疏数组
根据上图所示:
第一步:创建二维数组
//首先创建二维数组
int[][] ChessArr1 = new int[11][11];
//赋值
ChessArr1[1][2] = 1;
ChessArr1[2][3] = 2;
//循环遍历得到非零个数
int num = 0;
for(int[] row : ChessArr1) {
for(int data : row) {
if(data != 0) {
num++;
}
}
}
上面用到了增强for循环,第一个增强for循环表示每一个row代表一行(二维数组的行)也就相当与一维数组,第二个增强for循环再遍历一维数组得到每一个数据data来进行判断是否是非零数。
第二步:创建稀疏数组,并赋值
int[][] SparseArr = new int[num + 1][3];
//第一行赋值
SparseArr[0][0] = 11;
SparseArr[0][1] = 11;
SparseArr[0][2] = num;
前面分析的时候说了,第一行是固定的,二维数组的大小是知道的,所以行列的总数可以直接赋值,总有效个数也求了,也可以直接赋值。
第三步:遍历二维数组并赋值给稀疏数组
int count = 0;
for(int i = 0; i < 11; i++) {
for(int j = 0; j < 11; j++) {
if(ChessArr1[i][j] != 0) {
count++;
SparseArr[count][0] = i;
SparseArr[count][1] = j;
SparseArr[count][2] = ChessArr1[i][j];
}
}
}
遍历二维数组,判断条件是这个数不等于零,此处需要一个计数变量,每符合一个非零数,计数变量就加一,可以用来表示稀疏数组的第几行,稀疏数组的列数是固定的,所以找到后直接进行赋值操作。
最后打印稀疏数组即可。
完整代码
//首先创建二维数组
int[][] ChessArr1 = new int[11][11];
//赋值
ChessArr1[1][2] = 1;
ChessArr1[2][3] = 2;
//将原始数组转 换成 稀疏数组
//1、先遍历原始数组得到非0数的个数
int num = 0;
for(int[] row : ChessArr1) {
for(int data : row) {
if(data != 0) {
num++;
}
}
}
//2、创建 稀疏数组
int[][] SparseArr = new int[num + 1][3];
//3、第一行赋值
SparseArr[0][0] = 11;
SparseArr[0][1] = 11;
SparseArr[0][2] = num;
//4、循环赋非0值
int count = 0;
for(int i = 0; i < 11; i++) {
for(int j = 0; j < 11; j++) {
if(ChessArr1[i][j] != 0) {
count++;
SparseArr[count][0] = i;
SparseArr[count][1] = j;
SparseArr[count][2] = ChessArr1[i][j];
}
}
}
//5、打印稀疏数组
System.out.println("\n===打印稀疏数组===");
for(int[] row : SparseArr) {
for(int data : row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
三、稀疏数组→二维数组
第一步:创建新的二维数组
//1、定义一个新的二维数组
int[][] ChessArr2 = new int[SparseArr[0][0]][SparseArr[0][1]];
二维数组的大小来自稀疏数组的第一行第一列和第一行第二列,也就是 SparseArr[0][0] 和 SparseArr[0][1] ;初始状态下的二维数组数据全为零。
第二步:循环遍历并赋值
//2、赋值
for(int i = 1; i <= SparseArr[0][2]; i++) {
ChessArr2[SparseArr[i][0]][SparseArr[i][1]] = SparseArr[i][2];
}
因为除了少数是有效个数,其他全是零,所以我们只需要遍历有效个数。i 表示第几个有效个数也表示当前这个数在稀疏数组中的行,如上图所示:如 i = 1,表示在稀疏数组的第一行,它在二维数组中的位置为 (1,2),数值为 1 ;所以行和列分别是SparseArr[1][0]和SparseArr[1][1],数值为SparseArr[1][2]。
所以赋值表达式为:ChessArr2[SparseArr[i][0]][SparseArr[i][1]] = SparseArr[i][2]。
完整代码
//将稀疏数组 转换成 二维数组
//1、定义一个新的二维数组
int[][] ChessArr2 = new int[SparseArr[0][0]][SparseArr[0][1]];
//2、赋值
for(int i = 1; i <= SparseArr[0][2]; i++) {
ChessArr2[SparseArr[i][0]][SparseArr[i][1]] = SparseArr[i][2];
}
//3、打印新的二维数组
System.out.println("\n===新的二维数组===");
for(int[] row : ChessArr2) {
for(int data : row) {
System.out.printf("%d\t",data);
}
System.out.println();
}
来源:https://blog.csdn.net/yzh2776680982/article/details/125706458


猜你喜欢
- 什么是tcpTcp通信有两个特点分别是面向连接,具有可靠性.面向连接:指的是客户端与服务端之间的连接,在通信之前会有三次握手的机制来确保连接
- 本文实例为大家分享了Unity shader百叶窗展示的具体代码,供大家参考,具体内容如下1.将图片划分为水平N栏,代码如下:Shader
- 说实话,对于xUtils,是我最近才用到的开发框架(也是刚接触),对于其功能不得不说,简化了很多的开发步骤,可以说是非常好的开发
- 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Ap
- 大家可以自行百度下阿里分布式事务,在这里我就不啰嗦了。下面是阿里分布式事务开源框架的一些资料,本文是springboot+dubbo+fes
- 对于Hibernate刚刚学习了一周时间了,作为一名java初学者,也有点自己的感受想分享出来,如果这篇文章能有幸被大家看到,也仅供大家娱乐
- 最近学习Spring的源码,发现一个利器BeanPostProcessor。这个后置处理器可以在bean初始化前后对bean进行操作。我们可
- 上文对数据结构与算法,有了一个简单的概述与介绍,这篇文章,我们介绍一中典型数据结构——线性结构。什么是线性结构,线性结构是最简单、最基本、最
- 前言最近在学习网络原理,突然萌发出自己实现一个网络服务器的想法,并且由于第三代小白机器人的开发需要,我把之前使用python、PHP写的那部
- 本文实例为大家分享了Android实现支付宝记账饼图,点击旋转到最下面,供大家参考,具体内容如下代码:package com.example
- let 和 var(a): let 声明的变量只在 let 命令所在的代码块内有效(b): let 是在代码块内有效,var 是在全局范围内
- 最近在写我们大三项目的一个视频文件上传的页面,实现后台对上传的进度进行监听,然后将监听的信息返回给前台页面。前台的页面效果图:前台进度条控件
- 本文实例为大家分享了java实现选课系统的具体代码,供大家参考,具体内容如下这个程序主要是练习IO(文件读写,序列化),集合框架的使用学生端
- 前段时间在项目开发中,有listview实现单选和多选的效果,特别是listview的单选效果,一开始项目比较紧,自己考虑的是用listvi
- 本文实例讲述了C#调用Oracle存储过程的方法。分享给大家供大家参考。具体实现方法如下:Oracle数据库代码如下:create or r
- 无论是我们在使用word还是记事本,系统都会为我们提供撤销的功能,这几乎是人人都会使用到的功能,而在我们实际开发中,会不会存在一个很复杂的对
- 本文实例为大家分享了Android实现点击某个按钮指定位置弹出布局,供大家参考,具体内容如下package com.topcee.repor
- Java实现远程控制技术java自带的java.net.和java.awt.robot. 的混合可以用于实现通过网络对另一台计算机的远程控制
- AIDL:Android Interface Definition Language,它是一种android内部进程通信接口的描述语言,通过
- Common.cs: using System; using System.Collections.Generic; using Syste