java数据结构基础:稀疏数组

 更新时间:2021年08月01日 10:41:58   作者:去吧猫头夜鹰  
今天带大家了解一下Java稀疏数组的相关知识,文中有非常详细的介绍及代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下

稀疏数组:

当一个二维数组中大部份的值为0,或者为同一值的时候,可以用稀疏数组来保存

实现思路:

记录二维数组有多少行多少列、多少个不同的值

把不同的值按照所在行列,记录在一个规模较小的数组中

举例:

11×11的二维数组:

对应的稀疏数组:

其中,第一行分别为,原二维数组总行数、总列数、不为0的数的个数

之后几行的每一列分别代表所在行、所在列、值

二维数组转稀疏数组实现思路:

1. 遍历二维数组,得到非0数据的个数

2. 创建对应的稀疏数组

3. 再次遍历二维数组,将非0的值存放到稀疏数组中

稀疏数组恢复二维数组实现思路:

1. 读取稀疏数组的第一行,根据第一行的数据,创建对应的二维数组

2. 读取稀疏数组后几行的数据,赋值给二维数组

代码实现:

//稀疏数组
public class SparseArray {
	public static void main(String[] args) {
		//创建一个原始的二维数组11 * 11
		int[][] chessArr = new int[11][11];
		chessArr[1][2] = 1;
		chessArr[2][3] = 2;
		chessArr[4][5] = 2;
		//输出原始的二维数组
		for (int[] row : chessArr) {
			for (int i : row) {
				System.out.printf("%d\t", i);
			}
			System.out.println();
		}

		//二维数组转稀疏数组
		//首先遍历二维数组,得到非0数据的个数
		int sum = 0;
		for (int i = 0; i < 11; i++) {
			for (int j = 0; j < 11; j++) {
				if (chessArr[i][j] != 0) {
					sum++;
				}
			}
		}
		//创建对应的稀疏数组
		int[][] sparseArr = new int[sum + 1][3];
		//对稀疏数组赋值
		sparseArr[0][0] = 11;
		sparseArr[0][1] = 11;
		sparseArr[0][2] = sum;
		//遍历二维数组,将非0的值存放到稀疏数组中
		int count = 0;	//用于记录是第几个非0数据
		for (int i = 0; i < 11; i++) {
			for (int j = 0; j < 11; j++) {
				if (chessArr[i][j] != 0) {
					count++;
					sparseArr[count][0] = i;
					sparseArr[count][1] = j;
					sparseArr[count][2] = chessArr[i][j];
				}
			}
		}
		//输出稀疏数组
		for(int i = 0; i < sparseArr.length; i++) {
			System.out.printf("%d\t%d\t%d\t", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
			System.out.println();
		}

		//稀疏数组恢复二维数组
		//首先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
		int newChessArr[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
		//读取稀疏数组后几行的数据,赋值给二维数组
		for(int i = 1; i < sparseArr.length; i++) {
			newChessArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
		}
		//输出恢复后的二维数组
		//输出原始的二维数组
		for (int[] row : newChessArr) {
			for (int i : row) {
				System.out.printf("%d\t", i);
			}
			System.out.println();
		}
	}
}

输出结果:

0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 2 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
11 11 3
1 2 1
2 3 2
4 5 2
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 2 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • Spring Boot Swagger2使用方法过程解析

    Spring Boot Swagger2使用方法过程解析

    这篇文章主要介绍了Spring Boot Swagger2使用方法过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Java设计模式之状态模式详解

    Java设计模式之状态模式详解

    Java 中的状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态发生改变时改变其行为,本文将详细介绍 Java 中的状态模式,我们将从状态模式的概述、结构与实现、优缺点、适用场景等方面进行讲解,需要的朋友可以参考下
    2023-05-05
  • Java使用正则表达式演示电话与邮箱格式

    Java使用正则表达式演示电话与邮箱格式

    本文详细讲解了Java正则表达式的用法,举例演示电话和邮箱格式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • 详解Java中的ThreadLocal

    详解Java中的ThreadLocal

    ThreadLocal是JDK包提供的,它提供线程本地变量,如果创建一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个副本,在实际多线程操作的时候,操作的是自己本地内存中的变量,从而规避了线程安全问题
    2021-06-06
  • java前后端传值,参数有集合类型的数据时的两种操作方式

    java前后端传值,参数有集合类型的数据时的两种操作方式

    这篇文章主要介绍了java前后端传值,参数有集合类型的数据时的两种操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • SpringBoot与Quartz集成实现分布式定时任务集群的代码实例

    SpringBoot与Quartz集成实现分布式定时任务集群的代码实例

    今天小编就为大家分享一篇关于SpringBoot与Quartz集成实现分布式定时任务集群的代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Java二叉树的遍历思想及核心代码实现

    Java二叉树的遍历思想及核心代码实现

    今天小编就为大家分享一篇关于Java二叉树的遍历思想及核心代码实现,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • springmvc 参数绑定总结

    springmvc 参数绑定总结

    本篇文章主要介绍了详解springmvc 参数绑定,详细的介绍了springmvc各种参数绑定的情况,具有一定的参考价值,有兴趣的可以了解一下。
    2017-03-03
  • SpringBoot下载Excel文件时,报错文件损坏的解决方案

    SpringBoot下载Excel文件时,报错文件损坏的解决方案

    这篇文章主要介绍了SpringBoot下载Excel文件时,报错文件损坏的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • SpringBoot中处理的转发与重定向方式

    SpringBoot中处理的转发与重定向方式

    这篇文章主要介绍了SpringBoot中处理的转发与重定向方式,分别就转发和重定向做了概念解说,结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-11-11

最新评论