稀疏数组和二维数组转换

  • 稀疏数组:当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组

  • 稀疏数组的处理方法:

    • 记录数组一共有多少行,有多少个不同的值
    • 把具有不同值得元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
  • 应用:

    • 保存二维数组(棋盘、地图)
  1. 二维数组 ——> 稀疏数组的思路

    1. 遍历原始二维数组,得到有效数据的个数sum
    2. 根据sum创建稀疏数组SparseArr int[sum + 1][3]
    3. 将二维数组的有效数据存入到稀疏数组
  2. 稀疏数组 ——> 二维数组
    1. 读取稀疏数组的第一行,根据第一行的数据,创建原始二维数组,比如上面的chessArr2 = int[11][11]
    2. 在读取稀疏数组后几行的数据,并赋给原始的二维数组即可
package com.starking.sparseArr;/*** @author Manix* 稀疏数组和原始二维数组的相互转换写入文件,保存和读取*/public class SparseArray {public static void main(String[] args) {//创建一个二维数组 11*11//0:没有棋子,1:黑子, 2:蓝子int[][] chessArr1 = new int[11][11];chessArr1[1][2] = 1;chessArr1[2][3] = 2;//输出原始二维数组System.out.println("原始的二维数组为:");for (int[] row : chessArr1) {for (int item : row) {System.out.printf("%d\t", item);}System.out.println();}//将二维数组 转 稀疏数组的思路//先遍历二维数组,得到非0个元素个数int sum = 0;for (int i = 0; i < 11; i++) {for (int j = 0; j < 11; j++) {if (chessArr1[i][j] != 0) {sum++;}}}System.out.println("有效元素的数量Sum为:" + sum);//2.创建对应的稀疏数组int[][] sparseArr = new int[sum + 1][3];//给稀疏数组赋值sparseArr[0][0] = 11;sparseArr[0][1] = 11;sparseArr[0][2] = sum;//         给稀疏数组赋值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];}}}//输出稀疏数组System.out.println();System.out.println("原始二维数组----》---稀疏数组:");for (int i = 0; i < sparseArr.length; i++) {System.out.printf("%d\t%d\t%d\t\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);}//将稀疏数组----》---恢复成原始的二维数组int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];for (int i = 1; i < sparseArr.length; i++) {chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];}System.out.println();//输出恢复之后的二维数组System.out.println("稀疏数组----》---恢复的二维数组:");for (int[] row : chessArr2) {for (int item : row) {System.out.printf("%d\t", item);}System.out.println();}}/*** 添加保存稀疏数组和从本地文件读取稀疏数组的功能*///    创建内部类---保存和读取稀疏数组工具类public static class SaveAndReadUtil {//      写入文件的方法public static 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 j = 0; j < array.length - 1; j++) {fw.write(ints[j] + "\t");}//数组的最后一行不加"\t"fw.write(ints[array[0].length - 1] + "");fw.write("\n");}//刷新流fw.flush();} catch (IOException e) {e.printStackTrace();} finally {try {//如果fw不为空,就将其关闭if (fw != null) {fw.close();}} catch (IOException e) {e.printStackTrace();}}}//读取数组文件的方法public static int[][] readArray(String path) {//声明字符输入流FileReader fr = null;//声明字符输入缓冲流BufferedReader br = null;//定义一个二维数组int[][] sparseArr0 = null;try {fr = new FileReader(path);//通过BufferReader包装字符输入流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 columnNum = s.split("\t").length;//根据文件行数和列数创建对应的数组sparseArr0 = new int[list.size()][columnNum];//记录输出当前行数int count = 0;//遍历集合,将集合中的数据存入数组中for (String str : list) {//读取str按照“\t”分割,用字符串数组接收String[] strs = str.split("\t");for (int i = 0; i < columnNum; i++) {sparseArr0[count][i] = Integer.parseInt(strs[i]);}count++;}} catch (IOException 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 sparseArr0;}}}

java 稀疏数组和二维数组转换,并保存稀疏数组到文件后可以读取相关推荐

  1. JAVA描述算法和数据结构(01):稀疏数组和二维数组转换

    一.基本简介 1.基础概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵:与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵.定义非零元 ...

  2. java 二维数据结构_JAVA描述算法和数据结构(01):稀疏数组和二维数组转换

    一.基本简介 1.基础概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵:与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵.定义非零元 ...

  3. 浅谈:稀疏数组与二维数组之间的转换

    学习笔记 二维数组简介 二维数组本质上是以数组作为数组元素的数组,即"数组的数组",类型说明符 数组名[常量表达式][常量表达式].二维数组又称为矩阵,行列数相等的矩阵称为方阵.对 ...

  4. 【java基础】——一维数组和二维数组存储占用内存大小问题

    问题:在java中,一维数组和二维数组在数据量一样的情况下,开辟的内存大小是怎样的? 一.尝试阶段: 1.代码一: public class OneArrayMemory{public static ...

  5. java基础5 (一维)数组和二维数组

    本文知识点(目录): 一维数组(一维数组的概念.优点.格式.定义.初始化.遍历.常见异常.内存分析以及常见操作(找最大值.选择排序.冒泡排序等等))     二维数组(二维数组的遍历.排序.查找.定义 ...

  6. Java——动态创建一维数组和二维数组

    一.数组的定义: 整数型一维数组:int[] a;或 int a[];        a = new int[m];(m为数组元素个数) 整数型二维数组:int[][] a;或 int a[][];或 ...

  7. 稀疏数组(二维数组)

    1.2.1 稀疏数组(二维数组) 一.应用场景 应用场景:当一个数组中大部分数据为同一个值时. 应用方法:1.记录数组中,一共有几行几列,有多少个不一样的值. ​ 2.把有不一样值的行.列记录到一个小 ...

  8. Java中的一维数组和二维数组

    Java中的数组 常用的就是一维数组.二维数组. 一维数组 数组定义:数据就是相同数据元素的集合. 数组是一种引用数据类型.不属于基本数据类型. (1) 如何定义(声明)一维数组? 声明格式:数据类型 ...

  9. java 动态二维数组_Java数组、动态数组、二维数组的应用

    一.认识数组 1.容器的概念 ​用于存储数据的一块内存称为容器,生活中有很多容器,例如水杯,衣柜,以及存放"东西" ​存放在容器中的数据,称为"元素" 2.为什 ...

最新文章

  1. C#通过WMI的wind32 的API函数实现msinfo32的本地和远程计算机的系统摘要信息查看功能...
  2. Kubernetes——基本概念与理论
  3. BackGroundWorker用法
  4. bootstrap中表格、修饰图片、浮动、背景框、提示框及关闭提示框、元素淡入淡出及jQuery中操作类名
  5. Java中dao层、service层、controller层、entity层和view层的概述
  6. [深度学习] tensorflow1.x和tensorflow2.x对比与总结
  7. 95-848-020-源码-AKKA-Akka与Actor 模型
  8. Java判断文件是否为图片
  9. androidsettitle方法_android去掉标题方法
  10. python的if语句后面怎么加布尔运算符号是_10、python---- if布尔条件控制语法(二)...
  11. spring整合mybatis(详细)
  12. 元宇宙,是忽悠还是未来
  13. Linux 动、静态库原理深剖
  14. 【I.MX6ULL】6ull 加载 linux 驱动模块失败
  15. python画多边形太阳花
  16. 请求转发 tomcat 404错误
  17. python进行邮件文件.eml.pst.msg信息提取(包括附件)
  18. JavaScript基础的全部东东
  19. Python实现文本相似度比较分析
  20. 计算机毕业设计选题建议

热门文章

  1. Python爬虫1-Scrapy环境的安装
  2. python-----利用filecmp删除重复文件
  3. springboot +element-axios跨域请求
  4. d010:盈数、亏数和完全数
  5. Filter(过滤器)
  6. 设计模式笔记之十四 (命令模式)
  7. [置顶] 如何搭建一个 Data Guard 环境
  8. 用Zend Stuido 的WSDL编辑器
  9. C#程序可将文本文件藏于位图中,也可导出
  10. 为 ASP.NET Datagrid 创建自定义列