稀疏数组

理论补充

运用场景:当一个数组中大部分元素为0,或者为统一值的数组时。可以使用稀疏数组压缩数组释放占用的内存空间。
思想:第一行存储原数组:行,列,值。后续行存储原数组数据所在行,列,值。
稀疏数组大小:(x+1)*3。(x为原数组内的数组大小)

代码实现(包含持久化实现)

1.关键压缩算法逻辑

package com.b0.a1_1sparseArray;import com.b0.utils.SparseArrayUtils;/*** @author B0* @create 2022 09 20 9:47* @description 稀疏数组实现*/
public class SparseArray {public static void main(String[] args) {//1.创建并初始化稀疏数组int chessArr[][] = new int[11][11];//2.随机给稀疏数组赋值chessArr[1][2] = 1;chessArr[2][3] = 2;chessArr[3][4] = 3;//3.遍历输出原始数组,得到非0个数System.out.println("======原始二维数组======");int count=0;for (int[] ints : chessArr) {for (int anInt : ints) {if (anInt!=0){count++;}System.out.print(anInt+"\t");}System.out.println("");}//4.创建稀疏数组int sparseArray[][] = new int[count+1][3];//第一列存储数组整体信息sparseArray[0][0] = 11;sparseArray[0][1] = 11;sparseArray[0][2] = count;//5.遍历数组,取出非零值count = 0;//初始化countfor (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if (chessArr[i][j]!=0){count++;sparseArray[count][0] = i;sparseArray[count][1] = j;sparseArray[count][2] = chessArr[i][j];}}}//6.输出稀疏数组System.out.println("========稀疏数组=========");for (int[] ints : sparseArray) {for (int anInt : ints) {System.out.print(anInt+"\t");}System.out.println("");}//存入稀疏数组(持久化)和取出SparseArrayUtils sau = new SparseArrayUtils();sau.saveArray(sparseArray,"D:\\就业准备\\1.就业课程\\3.数据结构\\javaCode\\map.txt");int[][] sparseArray2 = sau.readArray("D:\\就业准备\\1.就业课程\\3.数据结构\\javaCode\\map.txt");//7.复原稀疏数组int[][] chessArr2 = new int[sparseArray[0][0]][sparseArray[0][1]];for (int i = 1; i < sparseArray.length-1; i++) {chessArr2[sparseArray2[i][0]][sparseArray2[i][1]] = sparseArray2[i][2];}//8.输出复原数组System.out.println("======复原后稀疏数组======");for (int[] ints : chessArr2) {for (int anInt : ints) {System.out.print(anInt+"\t");}System.out.println("");}}
}

2.持久化工具类编写

package com.b0.utils;import java.io.*;
import java.util.ArrayList;
import java.util.List;/*** @author B0* @create 2022 09 20 11:07* @description*/
public class SparseArrayUtils {/*** 写入文件* @param array* @param path*/public void saveArray(int[][] array,String path){//创建文件输入流FileWriter fw = null;try {//写入文件路径以及文件名File file = new File(path);if (!file.exists()){file.createNewFile();}//把文件写入字节流fw = new FileWriter(file);//循环遍历数组写入for (int[] ints : array) {for (int i=0;i<array.length-2;i++) {fw.write(ints[i]+"\t");}//最后一行不加\tfw.write(ints[array[0].length-1]+"");fw.write("\n");}//刷新流fw.flush();} catch (IOException e) {throw new RuntimeException(e);}finally {try {//如果fw不为空,将其关闭if(fw!=null){fw.close();}} catch (IOException e) {throw new RuntimeException(e);}}}/*** 读取数组的方法* @param path* @return*/public int[][] readArray(String path){//声明字符流FileReader fr = null;//声明字符缓冲流BufferedReader br = null;//定义二维数组int[][] sparseArr = null;try {fr = new FileReader(path);br = new BufferedReader(fr);//创建一个集合用来读取文件数据List<String> list = new ArrayList<>();//存放一行数据String lineStr;//逐行读取while ((lineStr = br.readLine())!=null){list.add(lineStr);}//获取文件行数int lineNum = list.size();//获取文件列数String s = list.get(0);int columNum = s.split("\t").length;//根据行列创建数组sparseArr = new int[list.size()][columNum];//记录输出当前行数int count = 0;//遍历集合,将集合中的数据存入数组中for (String str : list) {String[] strs = str.split("\t");for (int i = 0; i < columNum; i++) {sparseArr[count][i] = Integer.parseInt(strs[i]);}count++;}} catch (Exception e) {e.printStackTrace();}finally {//关闭字符输入流try {if (fr != null) {fr.close();}} catch (IOException e) {e.printStackTrace();}try {if (br != null) {br.close();}} catch (IOException e) {e.printStackTrace();}}//返回稀疏数组return sparseArr;}
}

数据结构和算法——基于Java——1.数组相关推荐

  1. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  2. 数据结构与算法【Java】05---排序算法总结

    前言 数据 data 结构(structure)是一门 研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码. 要学习好数据结构就要多多考虑如何将生 ...

  3. 数据结构与算法【Java】06---七大查找算法总结

    文章目录 数据结构与算法[Java]06---查找算法总结 1.查找算法简介 1.1.查找的定义 1.2.查找算法分类 1.3.常用查找算法 2.线性查找算法 2.1.线性查找简介 2.2.线性查找代 ...

  4. java环形链表_数据结构和算法(四)Java实现环形链表

    1. 数据结构和算法(四)Java实现环形链表 1.1 约瑟夫问题 约瑟夫问题:公元66年,约瑟夫不情愿地参与领导了犹太同胞反抗罗马统治的起义,后来起义失败,他和一些宁死不降的起义者被困于一个山洞之中 ...

  5. 02_JavaScript数据结构与算法(二)数组

    JavaScript 数据结构与算法(二)数组 几乎所有的编程语言都原生支持数组类型,因为数组是最简单的内存数据结构. 数组通常情况下用于存储一系列同一种数据类型的值. 但在 JavaScript 里 ...

  6. 数据结构与算法(Java版) | 本套系列教程的课程亮点和授课方式

    接下来,在这一讲,我会花一点时间同同学们达成一个共识,就是我们这套系列教程在讲述的时候,究竟是以一种什么方式来讲述的.我希望,经过我的讲解之后,大家能够对我们这套系列教程的课程亮点和授课方式达成如下这 ...

  7. Java数据结构和算法(二)——数组

    上篇博客我们简单介绍了数据结构和算法的概念,对此模糊很正常,后面会慢慢通过具体的实例来介绍.本篇博客我们介绍数据结构的鼻祖--数组,可以说数组几乎能表示一切的数据结构,在每一门编程语言中,数组都是重要 ...

  8. Java数据结构与算法(第二章数组)

    2019独角兽企业重金招聘Python工程师标准>>> 数组是应用最广泛的数据存储结构.它被植入到大部分编程语言中. Java中数组的基础知识     创建数组 在Java中把它们当 ...

  9. java中数组的数据结构_Java数据结构与算法(一)--数组

    目录 数组是应用最广泛的数据存储结构.它被植入大部分的编程语音.在Java中数组用来存放一种类型的集合. 1.数组的介绍 ①数组的声明 第一种方式: int[] arr = new int[10];/ ...

最新文章

  1. c++ 传入回调函数 参数没有传入_一文读懂回调函数
  2. oracle查询表的意思,Oracle表的查询(一)
  3. CCF NOI1056 表达式
  4. API接口通讯参数规范(2)
  5. 正确使用SqlConnection对象,兼谈数据库连接池
  6. java使用lua脚本操作 redis_Redis使用lua脚本
  7. 三星手机败走中国,血战印度
  8. ios 获取沙盒文件名_iOS 获取沙盒文件路径及 写入/删除 沙盒文件
  9. 华硕win10键盘失灵_Win10笔记本键盘失灵怎么办 Win10键盘失灵解决方法【详解】...
  10. 一群参与境内外赌博网站的开发的程序员被抓,网友:切勿面向监狱编程。。。...
  11. 强化学习-利用Q-Learning算法玩走方格游戏(C++)
  12. iphone通讯录备份怎么导出来
  13. Java方法反射的实现原理
  14. 计算机不能上网查找原因的步骤,电脑不能上网的原因及操作步骤_电脑突然不能上网...
  15. 时间复杂度的表示方式
  16. AGS测序下游分析一条龙
  17. python基础编程小实例2——绝对温标
  18. 伦敦银价格换算 在线
  19. 傅老师课堂:Oracle高级查询之OVER (PARTITION BY ..) 1
  20. Java核心类库之(网络编程:网络编程入门、UDP通信程序、TCP通信程序)

热门文章

  1. Qt4.8.6与Qt5.4.0的安装详解
  2. CCRC资质认证实施规则最新版
  3. 进销存管理系统的设计与实现
  4. NMI -- 不可屏蔽中断
  5. 优炫软件人口普查案例入选《创新100—2022数智化场景实践》
  6. 微风:新手如何自学平面设计
  7. Win7 Linux双系统,恢复Linux启动项
  8. Ubuntu 20.04更换主题美化教程
  9. Redis 无法持久化到硬盘错误:not able to persist on disk
  10. 数据库查询是地址信息