别让怯弱否定自己,别让惫懒误了青春。

简介

  • 有些时候,一个二维数组中很多值默认为0,因此很多无意义数据,这个时候就可以使用稀梳数组,例如:一个棋盘 10*10,但是只落下了两颗子,需要你保存整个棋盘的布局
 // 以上面棋盘为例,0代表无棋子,1代表黑棋子,2代表白棋子,数组结构如下:int[] ints = new int0 0 0 0 00 1 0 0 00 0 2 0 00 0 0 0 00 0 0 0 0

原理

  • 记录数组一共有几行几列,有多少个地方存在不同的值
  • 把不同值得元素及值记录在一个全新创建的小规模的数组中,从而压缩数据大小

示例

 // 以上面5*5棋盘为例:// 2排第二个不同// 3排第3个不同int[] ints = {{5,5,2},{1,1,1},{2,2,2}} // 5行5列2个不同值

相互转化

 // 原始数组int[][] ints = new int[5][5];ints[1][1] = 1;ints[2][2] = 2;for (int[] intArray : ints) {for(int intValue : intArray) {System.out.print(intValue+"t");}System.out.println();}// 输出---------------0 0 0 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 // 转化为稀疏数组--------------// 1.获取有效值数量,遍历二维数组得到有效的个数int sum = 0;for (int i = 0; i < ints.length; i++) {for (int j = 0; j < ints[i].length; j++) {if(ints[i][j] != 0){sum ++;}}}System.out.println(sum);// 转化为稀疏数组-------------int[][] sparseArray = new int[sum+1][3];sparseArray[0][0] = 5;sparseArray[0][1] = 5;sparseArray[0][2] = sum;int sumSparse = 0;for (int i = 0; i < ints.length; i++) {for (int j = 0; j < ints.length; j++) {if(ints[i][j] != 0){sumSparse++;sparseArray[sumSparse][0] = i;sparseArray[sumSparse][1] = j;sparseArray[sumSparse][2] = ints[i][j];}}}for (int i = 0; i < sparseArray.length; i++) {System.out.printf("%dt%dt%dtn",sparseArray[i][0],sparseArray[i][1],sparseArray[i][2]);}// 输出稀疏数组-------------5 5 2 1 1 1 2 2 2 // 还原稀疏数组-----------// 根据稀疏数组第一行生成数组长度int renewArray[][] = new int [sparseArray[0][0]][sparseArray[0][1]];// 根据稀疏数组的值还原数组for (int i = 1; i < sparseArray.length; i++) {renewArray[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];}for (int[] row : renewArray) {for(int data : row) {System.out.printf("%dt",data);}System.out.println();}

应用场景

  • 用于压缩数据
  • 使用稀疏数组,保存棋盘、地图之类的二维数组
  • 把稀疏数组还原成原来的二维数组

本文作者《猿氏·凯》,如果雷同,纯属抄袭····

中压缩数组_Java稀梳数组,什么是稀梳数组?为什么使用稀梳数组?相关推荐

  1. java数组中怎么去重_java数组去重怎么弄???大神来解

    [Java] 纯文本查看 复制代码public class TestDemo { public static void main(String[] args) { //10个整数{9,10,6,6,1 ...

  2. java 映射数组_Java中的数组,列表,集合,映射,元组,记录文字

    java 映射数组 有时,当我对JavaScript的强大功能和表现力感到兴奋时,我发现自己错过了Java世界中的一两个功能. 除了lambda表达式/闭包或任何您想称为"匿名函数" ...

  3. java声明和初始化数组_Java 中初始化数组

    数组是一种有用的数据类型,用于管理在连续内存位置中建模最好的集合元素.下面是如何有效地使用它们. -- Chris Hermansen(作者) 有使用 C 或者 FORTRAN 语言编程经验的人会对数 ...

  4. 扩容是元素还是数组_Java中对数组的操作

    数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对于数组的实现及处理也不尽相同. Java语言中提供的数组是用来存储固定大小的同类型元素.如:声明一个数组变量,numbers[100]来 ...

  5. java定义数组_java中数组的三种定义方式_java中数组的定义及使用方法(推荐)...

    java中数组的三种定义方式 java中,数组是一种很常用的工具,今天我们来说说数组怎么定义 [java] view plain copy /** * 数组的三种定义方法 * 1.数组类型[] 数组名 ...

  6. Java方法中数组_Java中数组常用方法的总结

    将截取一部分旧数组中的元素,复制给新数组, 反之,如果大于旧数组的长度,则将以 0 , null ,或 false 给予补充. 例:快速复制数组? public class Practice{ pub ...

  7. 转数组_Java中IO必杀技-文件转字节数组

    在Java开发中,无论是文件存储还是别的操作,需要经常把文件转化为字节数组,常规的做法就是用内存字节输出流ByteArrayOutPutStream 转化,这样虽然可以实现但是还是有些麻烦,今天教大家 ...

  8. java 数组对象属性数组_Java中数组的特性

    数组是基本上所有语言都会有的一种数据类型,它表示一组相同类型的数据的集合,具有固定的长度,并且在内存中占据连续的空间.在C,C++等语言中,数组的定义简洁清晰,而在java中确有一些会让人迷惑的特性. ...

  9. java单词转化为数组_java中数组与List相互转换的方法

    1.List转换成为数组.(这里的List是实体是ArrayList) 调用ArrayList的toArray方法. toArray public T[] toArray(T[] a)返回一个按照正确 ...

最新文章

  1. python Unicode转ascii码的一种方法
  2. [C++]C++11:Function与Bind
  3. 【ABAP】Smartforms无法打印特殊字符问题处理方案
  4. 2.2 数个常用的特殊符号
  5. c语言行列倒置算法,循环行列的元素倒置。求指点
  6. 为啥非要用Python?Excel不香吗?
  7. 【转】非常道-中小软件公司项目管理
  8. go语言结构体作为函数参数,采用的是值传递
  9. java连接远程带有密码的mongodb数据库
  10. 配置Typescript+Node环境
  11. CTF古典密码:移位密码
  12. Mac系统PR2022安装BeatEdit插件遇到各种问题解决
  13. Matlab中table2array函数使用
  14. Goonie企业竞争情报系统评为选中国优秀网络应用软件奖
  15. 三维重建 | 单张RGB图片生成三维网格模型
  16. 使用SaltStack Returner将Salt作业信息接入Elasticsearch的实践(踩坑)
  17. IEEE Access 算法 伪代码排版出错
  18. 名帖86 蔡襄 行楷《谢赐御书诗表》
  19. 嵌入式linux 系统支持usb wifi BL-R8723BT1
  20. MediaPlayer+SurfaceView实现视频播放器

热门文章

  1. 【转】DE2_TV例程的几点说明
  2. ORACLE 11G安装全过程
  3. 替代微软SMS的好工具——Lansweeper
  4. (二)spring cloud微服务分布式云架构-整合企业架构的技术点
  5. Nacos 发布 v0.8.0 Pre-GA版本,安全稳定上生产
  6. windows远程连接报错--“发生身份验证错误。要求的函数不受支持”
  7. 简单几步,教你部署一个可扩展微服务系统!
  8. 国网浙江电力组建网络安全分析室
  9. 选择51cto.com
  10. 路由器命令大全手册教程 4