
java稀疏数组
发布日期:2021-05-07 11:59:31
浏览次数:7
分类:原创文章
本文共 3572 字,大约阅读时间需要 11 分钟。
稀疏数组
应用场景
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
处理方法
- 记录数组一共有几行几列,有多少个不同的值。
- 把具体不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。
稀疏数组下标为0(第一行)存储的分别为原数组的行数、列数、和非零(不同值)元素个数。
基本思路
- 二维数据转稀疏数组的思路
- 遍历原始的二维数组,得到有效数据的个数sum
- 根据sum就可以创建稀疏数组sparseArr int[sum+1][3]
- 将二维数组的有效数据存入到稀疏数组
- 将稀疏数组转换为原始的二维数组的思路
- 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
- 再读取稀疏数组后几行的数据,并赋给原始的二维数组即可。
代码实现
import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.InputStream;public class SparseArray { public static void main(String[] args) { // TODO Auto-generated method stub //创建原始的二维数据 11 * 11 //0:表示没有棋子 1 :表示黑子 2 : 表蓝子 int chessArr1[][] = new int[11][11]; //进行赋值 chessArr1[1][2] = 1; chessArr1[2][3] = 2; chessArr1[4][5] = 2; //输出原始的二维数组 System.out.println("原始的二维数组"); for(int[] row : chessArr1) { for(int item : row) { System.out.printf("%d\t",item); } System.out.println(); } /** * 将二维数组转化为稀疏数组的思路 * 1.先遍历二维数组 得到非0的个数 */ int sum = 0; for (int i = 0; i < 11; i++) { for (int j = 0; j < 11; j++) { if(chessArr1[i][j] != 0) { sum++; } } } //2.创建对应的稀疏数组 int sparseArr[][] = new int[sum+1][3]; //给稀疏数组赋值 sparseArr[0][0] = chessArr1.length; sparseArr[0][1] = chessArr1[0].length; sparseArr[0][2] = sum; //3. 把二维数组中的非零数据存入到稀疏数组 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]; } } } /** * 将稀疏数组保存到map.data文件中 */ File file = new File("map.data"); try (FileWriter os = new FileWriter(file);){ //将稀疏数组写入到文件中 for(int[] row : sparseArr) { os.write(row[0] + "\t" + row[1] + "\t" + row[2] + "\r\n"); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } //输出稀疏数组 System.out.println("得到的稀疏数组为:"); for(int[] row : sparseArr) { System.out.printf("%d\t%d\t%d\t\n",row[0],row[1],row[2]); } /** * 读取文件的内容,并保存到数组 * 这里自定义一个数组,便于区分 */ int[][] sparseArr1 = null; //定义一个中间变量 获取文件中的value值 int temp = 1; int sparse_line = 1; try(BufferedReader br = new BufferedReader(new FileReader(file));) { String line = ""; line = br.readLine(); while(line != null) { String[] arr1 = line.split("\t"); //只执行一次 if(temp == 1) { sparseArr1 = new int[Integer.parseInt(arr1[2]) + 1][3]; sparseArr1[0][0] = Integer.parseInt(arr1[0]); sparseArr1[0][1] = Integer.parseInt(arr1[1]); sparseArr1[0][2] = Integer.parseInt(arr1[2]); temp = 0; }else { sparseArr1[sparse_line][0] = Integer.parseInt(arr1[0]); sparseArr1[sparse_line][1] = Integer.parseInt(arr1[1]); sparseArr1[sparse_line][2] = Integer.parseInt(arr1[2]); sparse_line++; } line = br.readLine(); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } sparseArr = sparseArr1; /** * 将稀疏数组恢复成原始二维数组 */ //1.通过获取稀疏数组的第一行数据,创建原始的二维数组 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("恢复的二维数组为:"); for(int[] row : chessArr2) { for(int item: row) { System.out.printf("%d\t",item); } System.out.println(); } }}
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年04月05日 00时01分17秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
血色先锋队
2019-03-04
win10系统安装配置Go环境包(第0章)
2019-03-04
搭建samba服务器
2019-03-04
Java: 错误: 不支持发行版本 5
2019-03-04
顺序表的操作总结
2019-03-04
Java基础语法
2019-03-04
原创-开发问题指南
2019-03-04
文本情感分类
2019-03-04
Python模块_os文件_目录方法
2019-03-04
部署kuboard3 管理工具
2019-03-04
SpringBoot中使用Mybatis访问MySQL数据库(使用xml方式)
2019-03-04
Algorithms Unlocked
2019-03-04
python中的map( )函数及lambda()函数简介
2019-03-04
SQL Sever 学习笔记三——聚合查询
2019-03-04
深度优先遍历(DFS)和广度优先遍历(BFS)
2019-03-04
轮播图——旋转木马(Jquery)
2019-03-04
普通平衡树板子
2019-03-04
操作DOM(二):删除节点、、复制节点、替换节点
2019-03-04
vue(7):表单输入绑定
2019-03-04